gpt4 book ai didi

scala - 当扩展特征中的特征时, 'super' 指的是什么?

转载 作者:行者123 更新时间:2023-12-03 04:18:49 25 4
gpt4 key购买 nike

我想扩展一个特征中的一个特征,如下所示:

  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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com