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
时,它使得你只能将traitT
放在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所指的