关于scala trait和子类重写如何结合的澄清
有人能确认我理解下面的测试吗?似乎当你在Scala中将一个特征添加到一个类中时,如果你引用super.symbol\u defined\u in\u trait,这个特征就会成为该类的超级特征。如果trait本身扩展了基类,那么trait的super将成为原始实现。我把事情搞砸了还是错过了什么大事关于scala trait和子类重写如何结合的澄清,scala,Scala,有人能确认我理解下面的测试吗?似乎当你在Scala中将一个特征添加到一个类中时,如果你引用super.symbol\u defined\u in\u trait,这个特征就会成为该类的超级特征。如果trait本身扩展了基类,那么trait的super将成为原始实现。我把事情搞砸了还是错过了什么大事 class Base { def doStuff = println("Base did stuff") } trait WrapBase extends Base { override d
class Base {
def doStuff = println("Base did stuff")
}
trait WrapBase extends Base {
override def doStuff = {
println("WrapBase did stuff");
super.doStuff
}
}
class Sub1 extends Base
class Sub2 extends Base with WrapBase
class Sub3 extends Base {
override def doStuff = {
println("Sub3 did stuff");
super.doStuff
}
}
class Sub4 extends Base with WrapBase {
override def doStuff = {
println("Sub4 did stuff");
super.doStuff
}
}
class Sub5 extends Base with WrapBase {
override def doStuff = {
println("Sub5 did stuff");
}
}
此测试打印出:
scala> (new Sub1).doStuff
Base did stuff
scala> (new Sub2).doStuff
WrapBase did stuff
Base did stuff
scala> (new Sub3).doStuff
Sub3 did stuff
Base did stuff
scala> (new Sub4).doStuff
Sub4 did stuff
WrapBase did stuff
Base did stuff
scala> (new Sub5).doStuff
Sub5 did stuff
Scala中的遗传包含格有向无环图。可以实例化的最终类是像饼一样构造的:底部总是某个类,然后有一些特性。性状的顺序由属性决定——任何性状都不依赖于高于它的其它性状。或者,等效地,该特性只能在其所有依赖项之上混合 UPD:以下想法是完全错误的: 一个类的主体也是一种特征,可以混合在顶部,也可以混合在中间: 结果将是 实际上,我误解了早期成员定义的功能 此语法仅适用于初始化VAL 这个例子应该是:
trait Sub6Changed extends Base {
override def doStuff = {
println("Sub6Changed did stuff")
super.doStuff
}
}
object Sub6 extends Base with Sub6Changed with WrapBase
另一方面,由于可能的重复,尽管这涉及多个特征,这涉及混合特征和类别的遗传。虽然我的scala很弱,但也许这些都是内在的、真正光滑的东西。很好知道{}后面跟着with,代码有编译问题
scala> Sub6.doStuff
WrapBase did stuff
Sub6 did stuff
Base did stuff
trait Sub6Changed extends Base {
override def doStuff = {
println("Sub6Changed did stuff")
super.doStuff
}
}
object Sub6 extends Base with Sub6Changed with WrapBase