0
scala> class A
defined class A

scala> trait T extends A { val t = 1 }
defined trait T

//why can I do this?
scala> class B extends T
defined class B

scala> new B
res0: B = B@2e9c76

scala> res0.t
res1: Int = 1

を書くと、のサブクラスであるクラスにtrait T extends Aのみトレイトを置くことができるようになると思いました。では、なぜ私はそれを着ることができますか?これはあなたがそれを混ぜるときだけですか?クラスを宣言するときにこれが不可能なのはなぜですか?TAB

4

3 に答える 3

5

「これにより、Aのサブクラスであるクラスにのみ特性Tを配置できるようになります。」

必要な機能は、セルフタイプの注釈です。この質問に対するDanielSobralの回答も参照してください。自己型と特性サブクラスの違いは何ですか?->dependency-injectionとcake-patternへのリンクを探します。

trait A { def t: Int }
trait B {
  this: A => // requires that a concrete implementation mixes in from A
  def t2: Int = t // ...and therefore we can safely access t from A
}

// strangely this doesn't work (why??)
def test(b: B): Int = b.t

// however this does
def test2(b: B): Int = b.t2

// this doesn't work (as expected)
class C extends B

// and this conforms to the self-type
class D extends B with A { def t = 1 }
于 2011-03-22T00:06:59.007 に答える
0

あなたは単に特性が何であるかについて混乱しています。単に言うことは、トレイトclass B extends Tの機能をBのクラス定義に「ミックスイン」していることを意味します。したがって、Tで定義されたすべて、またはその親クラスとトレイトは、Bで使用できます。

于 2011-03-22T07:41:32.397 に答える
0

あなたができないことは:

scala> class A2
defined class A2

scala> class B extends A2 with T
<console>:8: error: illegal inheritance; superclass A2
 is not a subclass of the superclass A
 of the mixin trait T
       class B extends A2 with T
                               ^

実際、書くことclass B extends Tは書くことと同じclass B extends A with Tです。

于 2011-04-16T16:32:58.653 に答える