Scala 为什么可以';我指定一个特征';什么是子类?

Scala 为什么可以';我指定一个特征';什么是子类?,scala,traits,Scala,Traits,我认为当你编写trait T扩展A时,它使得你只能将traitT放在A的子类上。那么为什么我可以把它放在B?这是你掺进去的时候用的吗?为什么在声明类时不能这样做 “它使你只能把它 T在一个类上,该类是“a”的子类 所需的功能是自类型注释。另请参见Daniel Sobral对这个问题的回答:-->查找依赖注入和蛋糕模式的链接 scala> class A defined class A scala> trait T extends A { val t = 1 } defined tr

我认为当你编写
trait T扩展A
时,它使得你只能将trait
T
放在
A
的子类上。那么为什么我可以把它放在
B
?这是你掺进去的时候用的吗?为什么在声明类时不能这样做

“它使你只能把它 T在一个类上,该类是“a”的子类

所需的功能是自类型注释。另请参见Daniel Sobral对这个问题的回答:-->查找依赖注入和蛋糕模式的链接

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
“它使你只能把它 T在一个类上,该类是“a”的子类

所需的功能是自类型注释。另请参见Daniel Sobral对这个问题的回答:-->查找依赖注入和蛋糕模式的链接

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

你只是对什么是特质感到困惑。说“B类扩展了T”仅仅意味着你将特性的功能“混入”到B的类定义中。因此,T中定义的所有内容或它的父类和特性都可以在B中使用。

你只是对特性是什么感到困惑。说
类B扩展了T
仅仅意味着你将特性的功能“混入”到B的类定义中。因此,T中定义的所有内容或它的父类和特性在B中都是可用的。

你不能做的是:

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 }
scala>A2类
定义类别A2
scala>B类用T扩展A2
:8:错误:非法继承;超类A2
不是超类a的子类
混合性状T
B类用T扩展A2
^

实际上,写
类B扩展T
与写
类B扩展A扩展T
是一样的,你不能做的是:

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 }
scala>A2类
定义类别A2
scala>B类用T扩展A2
:8:错误:非法继承;超类A2
不是超类a的子类
混合性状T
B类用T扩展A2
^

事实上,写
类B扩展T
与写
类B扩展A扩展T
是一样的,但是
特征T扩展A
应该只允许你将特征混入类A。如果你尝试用T做
新的B,它会按预期工作-它不会让你这样做。不,
trait T extends A
不应该只允许您将trait混入类A。它将类A的功能添加到trait T中。因此T具有类A的功能(方法和字段)以及您在T中定义的任何内容。当您说
class B extends T
时,你把T和A的所有东西都带进来了。@ThomasLockney你应该看看我想这就是Regy说的没错,但是
特质T扩展了A
应该只允许你把特质混入A类。如果你尝试用T做
新的B
,它就不会让你这么做了。不,
trait T extends A
不应该只允许您将trait混入类A。它将类A的功能添加到trait T中。因此T具有类A的功能(方法和字段)以及您在T中定义的任何内容。当您说
class B extends T
时,你带来了T和A的所有东西。@ThomasLockney你应该看看我想这就是Regy所指的