Я пытаюсь определить универсальный контейнер, элементы которого могут возвращать вмещающий контейнер. Что-то вроде:
abstract class Container[E <: Element] { // compile error
def contains( e: E ): Boolean
def addNewElement(): Unit
}
abstract class Element[C <: Container] { // compile error
def enclosingContainer(): C
}
class MyContainer extends Container[MyElement] {
private var elements = List[MyElement]()
override def contains( elem: MyElement ) = elements.contains( elem )
override def addNewElement() { elements ::= new MyElement(this) }
}
class MyElement( container: MyContainer ) extends Element[MyContainer] {
override val enclosingContainer = container
}
Однако этот фрагмент не компилируется, поскольку я должен задать параметр типа для Element
в определении abstract class Container[E <: Element]
и тип для Container
в определении abstract class Element[C <: Container]
.
Есть ли способ добиться поведения, которое я ищу? Есть ли соответствующее объявление для Container
и Element
? Должен ли я определять сторонний объект?