7

考慮事項:

abstract class Base {
  def something() = println("Base")
}

trait TraitA extends Base {
    abstract override def something() = { super.something(); println("TraitA"); }
}

class Child extends Base {
    override def something() {
        println("Child")
    }
}

その後:

val x = new Child with TraitA
x.something()

私は得る:

Child
TraitA

しかし、私が使用する場合:

class Child extends Base with TraitA {
    override def something() {
        println("Child")
    }
}

val x = new Child
x.something()

私が得るのは:

Child

では、建設現場または申告現場で特性を使用することの違いは何ですか?クラスの宣言でトレイトを拡張/使用しながら、最初の動作(スタック可能なトレイト)を使用できますか?

4

2 に答える 2

5

Scalaの積み重ね可能なトレイトとは、メソッドに複数の変更を適用するために連携して機能する複数のトレイトを混在させることができることを指します。これには、super.theMethodを呼び出し、その入力や出力を変更することが含まれます。しかし、特性の文脈でスーパーとは何ですか?トレイトが拡張するクラス(またはトレイト)?特性が混合されているクラス?場合によります!すべての混合された特性とすべてのスーパークラスは線形化されます。superは、チェーンのさらに上位にある最も近い先行定義を呼び出します。

投稿全文を読む

あなたの場合:
1。super.something()== Child.something()
2. super.something()== Base.something()とChild.something()はチェーン全体をオーバーライドします

ミックスインの種類は関係ありません。

class Child2 extends Child with TraitA

val x2 = new Child2
x2.something() 
/* 
   Child
   TraitA
*/

class Child3 extends Base with TraitA
val x3 = new Child3
x3.something()
/* 
   Base
   TraitA
*/
于 2012-09-17T16:50:44.117 に答える
2

最初の例では、最初のメソッドをオーバーライドしてから、スタックする方法BaseをミックスTraitAします。

2番目の例では、最初に混合TraitAしてから、結果の(スタックされた)メソッドをオーバーライドします。

于 2012-09-17T16:34:04.317 に答える