从Scala中的mixin访问重写的方法

zig*_*tar 4 scala traits

我想我已经在某处读过这是可能的.

用例

我想创建一个特性,混合时通过覆盖方法并将覆盖方法的结果存储在val中来记忆hashCode.

trait MemoHashCode {
  val hashCode = callToOverwritten_hashCode
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ing 9

只需使用super关键字:

trait MemoHashCode { 
  val hashCode = super.hashCode
}
Run Code Online (Sandbox Code Playgroud)

这是可能的,因为每个特征都隐含地扩展AnyRef了已经hashCode定义的特征.如果要使用未在每个对象上定义的方法,则必须确保该特征只能与具有您将要使用的方法实现的对象混合使用.这可以通过自我类型注释:

trait MemoSomethingElse { 
  this: SomeType => // SomeType has method somethingElse
  val somethingElse = super.somethingElse
}
Run Code Online (Sandbox Code Playgroud)

  • 您的示例无法编译.scala> trait MemoSomethingElse {| 这个:{def somethingElse:Int} => | val somethingElse = super.somethingElse | } <console>:7:error:value somethingElse不是java.lang.Object的成员,带有ScalaObject val somethingElse = super.somethingElse (3认同)
  • 注意结构类型(即通过它定义的成员而不是通过"普通"类型名称来识别类型),例如`this:{def somethingElse:Int} =>`行.使用Java反射实现对此类方法的调用并达到性能. (2认同)