В Scala, кроме наследования, есть метод, позволяющий узнать, когда вызывается метод базового класса? - PullRequest
1 голос
/ 29 августа 2011

Например, предположим, у меня есть следующий базовый класс, для которого я не могу изменить исходный код

class Base {
    def someMethod = ...
}

Если я определяю подкласс

class Sub extends Base {
    override def someMethod = ...
}

, когда я делаю

val sub = new Sub

Тогда я автоматически "узнаю", когда вызывается someMethod, потому что запущен sub.someMethod.Однако я хотел бы избежать создания подклассов, поэтому мне было интересно, есть ли какая-нибудь техника, с помощью которой я мог бы сделать

class NotSubclass {
    val Base = new Base
}

или аналогичный

И каким-то образом «присоединить» некоторый метод из Base, чтобы NotSubclass мог »знать "когда вызывался какой-то метод.Чтобы уточнить, что метод вызывается извне, я никогда не выполняю вызов в своем собственном коде.

Ответы [ 4 ]

5 голосов
/ 29 августа 2011

Если вы изменяете поведение класса, для которого у вас нет исходного кода, тогда вы можете попробовать Аспектно-ориентированное программирование .

Аспекты позволяют вам «обернуть» вызов метода, чтобы вы могли регистрировать информацию, или изменять входные параметры или возвращаемые значения, или даже просто полностью заменять вызов метода.

Если все, что вы хотите сделать, это записать информацию в журнал, то это будет хороший путь. Тем не менее, Аспекты могут привести к коду, который очень трудно понять и выполнять, если вы используете его повсюду, поэтому убедитесь, что он соответствует вашему варианту использования.

Вам нужно определить pointcut для интересующего вас метода.

Scala-IDE использует аспекты для встраивания кода в JDT, он использует AspectJ , поэтому он работает со Scala.

2 голосов
/ 29 августа 2011

Если метод принадлежит интерфейсу, вы можете переопределить его и обернуть Base. В противном случае вам не повезло.

1 голос
/ 29 августа 2011

Вы имеете в виду, как это?

class NotSubclass {
    val base = new Base

    def someMethod = base someMethod
}
0 голосов
/ 29 августа 2011

Я думаю, вы могли бы сделать это с помощью манипулирования байтовым кодом.PowerMock позволяет имитировать конструкторы, поэтому я предполагаю, что ту же технику можно использовать для замены байтового кода Base чем-то, что делает все, что вам нужно.

Этот подход, конечно, будет:

  • может привести в замешательство любого, кто об этом не знает.
  • потерпит неудачу, если у вас нет контроллеров, находящихся под вашим контролем.
  • может нарушить юридические ограничения
  • вообще плохая идея для производственного кода.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...