次のコードでは、クラスBがA1
を定義していても、特性C
およびD
のメソッドA1
が呼び出されるのはなぜですか?クラスにメソッドの実装があるときに特性のメソッドが呼び出される理由
scala> trait A {
| def A1 = A2
| def A2 //A2 is abstract and need implementation
| }
defined trait A
scala> class B extends A {
| def A2 = println("B") //implemented A2 in B
| }
defined class B
scala> val b1 = new B
b1: B = [email protected]
これは問題なく動作します。
scala> b1.A1
B
scala> b1.A2
B
現在、私は形質をミックスしています。 Cは、まだA2抽象
scala> trait C extends A {
| abstract override def A1 = {super.A1; C}
| def C = println("C")
| }
defined trait C
Dは、まだA2抽象強いテキスト私はBのA1は、BのA1は、唯一のBさんを呼び出すべきではありません呼び出すカム際にCとDが印刷されているのはなぜ
scala> trait D extends A {
| abstract override def A1 = {super.A1; D}
| def D = println("D")
| }
defined trait D
を持っていますA2はB?を印刷するために実装されていますか? D
b2: B with C with D = [email protected]
scala> b2.A1
B
C
D
scala> b2.A2
B
scala> val b3 = new B with D with C
b3: B with D with C = [email protected]
scala> b3.A1
B
D
C
達成したいことは何ですか?また、[trait linearizazion](https://stackoverflow.com/questions/34242536/linearization-order-in-scala)がScalaでどのように機能するかを見てください。例は完璧にうまく動作します。 –
は、形質がどのように呼び出されるかを理解したい。私は今、ヒントを得ていると思う。 –
'def'型のw/o型、' def'型の同じ名前(まだ型なし)、 'override' – cchantep