- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想扩展一个特征中的一个特征,如下所示:
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
}
}
如果这有效,这将是一个很好的表达方式“当你的Graph
”继承自<Whatever>Types
,其 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 和其他特征都在一个 bundle 中。或者,如果一个特征定义了一系列 Node 扩展,则从 ScrumptiousTypes 扩展应该使所有 Node 扩展都包含 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
}
}
------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
}
}
关于scala - 当扩展特征中的特征时, 'super' 指的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33839352/
我是一名优秀的程序员,十分优秀!