2017-10-04 8 views
0

私は2つの特性と1つのクラスを持っています。トレイトAはScalaのメソッドをオーバーライドできません

、両方の方法A1A2A1が、ここで実装それはスーパー使用すると、それは抽象的である必要があり、それはまだインスタンスクラスで実装を必要とされていても、トレイトB

scala> trait A { 
    | def A1 
    | def A2 
    | } 
defined trait A 

実装が必要。 A2は、私は今、私はタイプCであるべきオブジェクトC1を作成したい

scala> class C { 
    | def A1 = println("C") 
    | } 
defined class C 

(以前の特性に関連していない)A1を定義するクラスCを持っているが、私はいくつかをしたい今

scala> trait B extends A { 
    | abstract override def A1 = { 
    | super.A1 
    | } 
    | def A2 = println("B") 
    | } 
defined trait B 

を実施しています Bの機能性(例えば、 A2)。しかし、それはコンパイルされません。 CBA2を使用するにはどうすればよいですか? Cは既に A1を実装しているので、うまくいくはずです。

scala> val c1 = new C with B 
<console>:13: error: overriding method A1 in class C of type => Unit; 
method A1 in trait B of type => Unit cannot override a concrete member without a third member that's overridden by both (this rule is designed to prevent ``accidental overrides'') 
     val c1 = new C with B 
        ^

答えて

3

"偶発的なオーバーライド"を防ぐため、このエラーが発生しなくなりました。 A1メソッドはBCの両方で定義されていますが、コンパイラにとっては無関係で、同じ型シグニチャを持つだけです。したがって、このメソッドのオーバーライド実装をオブジェクトに提供する必要があります。あなたは次のようにすることができます:

val c1 = new C with B { 
    override def A1 = ??? // Add your implementation here. 
} 
関連する問題