Я хочу расширить черту в пределах признака, например:
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
- и почему?
Если вам интересно, почему я это делаю, так что я могу смешивать изменения сразу по нескольким признакам, поэтому унаследованные черты взаимодействуют, как объясняется в этом вопросе. В конечном классе Node (и других классах, с которыми он работает) я не хочу явно выделяться из каждого признака Node: я хочу смешивать из одной "вещи" (что бы это ни было) и получить все взаимно согласованные изменения, сделанные в Node, и другие черты, все в комплекте. Или, если один признак определяет кучу расширений до Node, расширение от ScrumptiousTypes должно сделать все Node -extensions содержать член scrumptiousness
, не указывая всех Node -extensions: trait Hypernode extends ScrumptiousTypes.Node
, trait ZealousNode extends ScrumptiousTypes.Node
и т.д.