Почему я не могу указать подкласс черты? - PullRequest
0 голосов
/ 22 марта 2011
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, он делает это так, что вы можете поместить черту T только в класс, который является подклассом A.Почему тогда я могу поставить его на B?Это только для того, когда вы смешиваете это?Почему это невозможно при объявлении класса?

Ответы [ 3 ]

5 голосов
/ 22 марта 2011

"это делает так, что вы можете поставить только черту T на классе, который является подклассом A "

Функция, которую вы хотите, представляет собой аннотацию самостоятельного типа. См. Также ответ Даниэля Собрала на этот вопрос: В чем разница между подтипами self-types и trait-подклассами? -> ищите ссылки на инъекцию зависимости и шаблон тортов.

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 }
0 голосов
/ 16 апреля 2011

То, что вы не можете сделать, это:

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.

0 голосов
/ 22 марта 2011

Вы просто не понимаете, что это за черта.Сказать class B extends T просто означает, что вы «смешиваете» функциональность признака с определением класса B. Итак, все, что определено в T или его родительских классах и признаках, доступно в B.

...