scala – 当在特质中扩展特征时,“超级”是指什么?
我想在一个特质中扩展一个特质,像这样:
trait NodeTypes { trait Node { def allNodesHaveThis: Int } } trait ScrumptiousTypes extends NodeTypes { trait Node extends super.Node { def scrumptiousness: Int } } trait YummyTypes extends NodeTypes { trait Node extends super.Node { def yumminess: Int } } object Graph extends NodeTypes with ScrumptiousTypes with YummyTypes { case class Node() extends super.Node { override def allNodesHaveThis = 1 override def scrumptiousness = 2 // error: ScrumptiousTypes.Node has been disinherited override def yumminess = 3 } } 如果这样工作,这将是一个很好的方式,说“当你的图继承自< Whatever>类型时,它的Node类必须提供< Whatever>所需的方法. 但Scala 2.11.2编译器说: error: method scrumptiousness overrides nothing override def scrumptiousness = 2 ^ 看起来,YummyTypes.Node阴影ScrumptiousTypes.Node,遵循Scala解决方法的“钻石”继承的通常方式:按类型线性化.据了解,事实上,这应该是可以的,因为YummyTypes.Node明确地扩展了super.Node,通过相同的类型线性化,应该引用ScrumptiousTypes. 我有什么误解?或者,super.Node是什么引用的,为什么? 如果你想知道为什么我这样做,那么我可以一次将变化组合成几个特征,所以继承的特征是互操作的,如this question中所述.在最后的Node类(和其它类一起工作)中,我不想明确地从每个节点特征扩展:我想从一个“东西”(无论是什么)混合,并且获得与Node和所有其他特征的所有相互一致的更改.或者,如果一个特征定义了一些对Node的扩展,从ScrumptiousTypes扩展应该使所有的Node-extensions都包含一个scrumptiousness成员,而不必列出所有的Node-extensions:trait Hypernode extends ScrumptiousTypes.Node,trait ZealousNode extends ScrumptiousTypes .Node等 解决方法
使用类型也解决了这个问题
trait NodeTypes { trait Node { def allNodesHaveThis: Int } } trait ScrumptiousTypes extends NodeTypes { trait Node extends super.Node { def scrumptiousness: Int } type ScrumptiousTypesNode = this.Node } trait YummyTypes extends NodeTypes { trait Node extends super.Node { def yumminess: Int } type YummyTypesNode = this.Node } object Graph extends NodeTypes with ScrumptiousTypes with YummyTypes { case class Node() extends ScrumptiousTypesNode with YummyTypesNode { override def allNodesHaveThis = 1 override def scrumptiousness = 2 override def yumminess = 3 } } —— V2 ——- trait NodeTypes { trait Node { def allNodesHaveThis: Int } } object NodeTypes extends NodeTypes trait ScrumptiousTypes extends NodeTypes { trait Node { def scrumptiousness: Int } type ScrumptiousTypesNode = this.Node } object ScrumptiousTypes extends ScrumptiousTypes trait YummyTypes extends NodeTypes { trait Node { def yumminess: Int } type YummyTypesNode = this.Node } object YummyTypes extends YummyTypes trait Nodes { trait Nodes extends NodeTypes.Node with YummyTypes.Node with ScrumptiousTypes.Node } object Graph extends Nodes { case class Nodes() extends super.Nodes { override def yumminess: Int = 1 // override def scrumptiousness: Int = 2 override def allNodesHaveThis: Int = 3 } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |