关于scala trait和子类重写如何结合的澄清

关于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

有人能确认我理解下面的测试吗?似乎当你在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 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