0
trait A { 
    def a 
    def b 
    def c 
} 

object A { 
    def apply = { 
     new A { 
      def a = 1 
      def b = 2 
      def c = 3 
     } 
    } 
} 

私はここで特性Aを持ち、コンパニオン・オブジェクトの適用メソッドはそれを実装しています。スカラーのコール・スーパークラス適用メソッド

trait B extends A { 
    def d 
} 

object B { 
    def apply = { 
     new B { 
      def d = 4 
     } 
    } 
} 

私もAのA/B/Cのメソッドを実装する必要があるため当然の形質Bはコンパイルされませんが、私はこの方法を適用するAさんを呼び出してから、ちょうどBのDのメソッドを実装することができます方法はありますか?

私はB.applyの/ b/cをオーバーライドして、super.a/b/cを呼び出すのは片方向だと思うが、A-> B-> C-> D、Iリーフノード内のすべてのスーパークラスのメソッドをオーバーライドする必要はありません。

ご意見ありがとうございました。

答えて

1

あなたがAを変更することができる場合、私が最も合理的な解決策はA.apply()から返された匿名クラスに名前を与えることであると思う:

object A { 
    class AImpl extends A { 
     def a = 1 
     def b = 2 
     def c = 3 
    } 
    def apply = new AImpl 
} 

object B { 
    def apply = { 
     new AImpl with B { 
      def d = 4 
     } 
    } 
} 

私はBに/ B/Cをオーバーライドすることだと思います適用し、super.a/b/cを呼び出すことは一方通行です

いいえ、それは動作しません。そうした場合、それらを無効にする必要はありません。

+0

ありがとう、それは動作します!私はオブジェクトBにBImplを持っていることになり、複数の層の継承で動作します。 – wilberpan

関連する問題