Ben*_*itz 15 scala traits super mixins inner-classes
我想在一个特征中扩展一个特征,如下所示:
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
}
}
Run Code Online (Sandbox Code Playgroud)
如果这样做,那将是一种很好的说法,"当你的Graph继承<Whatever>Types,它的Node类必须提供所需的方法<Whatever>."
但是Scala 2.11.2编译器说:
error: method scrumptiousness overrides nothing
override def scrumptiousness = 2
^
Run Code Online (Sandbox Code Playgroud)
它似乎是YummyTypes.Node阴影ScrumptiousTypes.Node,遵循Scala解决方法的"钻石"继承的通常方式:通过类型线性化.正如我理解的那样,那应该没问题,因为YummyTypes.Node显式扩展super.Node,通过相同类型的线性化应该引用ScrumptiousTypes.
我误解了什么?或者,什么super.Node指的是 - 为什么?
如果你想知道为什么我这样做,那么我可以同时将变化混合到几个特征中,所以继承的特征可以互操作,如本问题所述.在最后的Node类(以及它使用的其他类)中,我不希望从每个Node特征显式扩展:我想从一个"东西"(无论它是什么)混合并得到所有相互一致的变化制作Node和其他特征,都在捆绑中.或者,如果一个特征定义了一组扩展节点,从ScrumptiousTypes延长应使所有节点的扩展包含的scrumptiousness成员,而不必列出所有节点的扩展: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
}
}
Run Code Online (Sandbox Code Playgroud)
------ v2 -------使用对象包含到Node,但是因为路径依赖它不是一个好主意,也许它会是问题
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
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
504 次 |
| 最近记录: |