在Scala中,除了继承之外还有一种技术可以知道何时调用基类方法?

del*_*ber 1 java jvm scala

例如,假设我有以下基类,我无法修改源代码

class Base {
    def someMethod = ...
}
Run Code Online (Sandbox Code Playgroud)

如果我定义一个子类

class Sub extends Base {
    override def someMethod = ...
}
Run Code Online (Sandbox Code Playgroud)

当我做

val sub = new Sub

然后我会在调用someMethod时自动"知道"因为触发了sub.someMethod.但是我想避免继承子类,所以我想知道是否有一些我可以做的技术

class NotSubclass {
    val Base = new Base
}
Run Code Online (Sandbox Code Playgroud)

或类似的

并以某种方式从Base"附加"someMethod,以便NotSubclass在调用someMethod时"知道".为了澄清someMethod被外部调用,我从不在我自己的代码中调用.

Mat*_*ell 5

如果要修改没有源代码的类的行为,那么可以尝试查看面向方面的编程.

方面允许您"包装"方法调用,以便您可以记录信息,或修改输入参数或返回值,甚至只是完全替换方法调用.

如果您只想做日志信息,那么这将是一个很好的方法.但是,如果您在任何地方使用它们,Aspects可能会导致很难理解和遵循的代码,因此请确保它适合您的用例.

您需要为您感兴趣的方法定义切入点.

斯卡拉-IDE使用方面编织代码到JDT,它使用AspectJ的,所以它不使用Scala工作.