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

时间:2011-04-16 20:05:33

标签: scala traits

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

用例

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

trait MemoHashCode {
  val hashCode = callToOverwritten_hashCode
}

1 个答案:

答案 0 :(得分:9)

只需使用super关键字:

trait MemoHashCode { 
  val hashCode = super.hashCode
}

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

trait MemoSomethingElse { 
  this: SomeType => // SomeType has method somethingElse
  val somethingElse = super.somethingElse
}