Как указать для определенного включающего объекта трейт, зависящий от пути, что этот трейт должен поддерживать дополнительную функцию? override trait
? Как вы относитесь к исходной черте, которую расширяет подчерта?
В частности, я хочу переопределить черту Delta
в каждом объекте DeltaSet
:
trait DeltaSet {
type PertainsTo
trait Delta {
val pertainsTo: PertainsTo
}
. . .
}
По-английски это звучит так: «Каждое Delta
в одном и том же DeltaSet
должно относиться к одному и тому же типу вещей».
Объект DeltaSet
должен иметь возможность добавлять дополнительные атрибуты к признаку Delta
, например source
здесь:
val deltaSet = new DeltaSet {
override type PertainsTo = UnorderedPair[TestNode]
override trait Delta /* extends DeltaSet.Delta?? */ { // <-- THE MYSTERY
val source: TestNode
}
. . .
}
На английском языке это звучит так: «Каждый Delta
для deltaSet
должен также указать источник».
Таким образом, классы Delta
для использования с этим объектом DeltaSet
должны переопределять атрибут source
, например:
case class MakeLinkDelta(fromNode: TestNode, toNode: TestNode)
extends deltaSet.Delta
{
override val pertainsTo = new UnorderedPair(fromNode, toNode)
override val source = fromNode
. . .
}
и аналогично для BreakLinkDelta
и других Deltas
для deltaSet
. (Каждый Delta
для этого DeltaSet
описывает изменение, которое необходимо внести в граф. Другие DeltaSet
содержат изменения совершенно разных типов объектов.)
Я пробовал много вариантов, включая trait BaseDelta {...}; type DeltaT <: BaseDelta
, и пока ни один из них не скомпилировался. Как вы «скажете» на Scala: «Только для этого DeltaSet
я хочу потребовать, чтобы каждый Delta
предоставлял атрибут source
?»