First, let me apologize if my question is unclear. I haven't chosen the Scala language yet, so I'm probably combining the terms. I think my example will be clearer.
I am trying to create a feature Hierarchicalthat mainly describes the vertices in the graph — any object that can have a parent list and a list of children.
More specific:
1) A Hierarchicalmay or may not have parents.
2) If so, parents Hierarchical.
3) A Hierarchicalwill have children, which are also Hierarchical.
Here is my common trait:
trait Hierarchical[Parent <: Hierarchical[Parent, Child],
Child <: Hierarchical[Parent, Child]] {
val parents: Option[List[Hierarchical[Parent, Child]]] = None
var children: List[Hierarchical[Parent, Child]] = List()
def addChild(child: Child) = children ++= List(child)
}
- "" , , - , None. Hierarchical:
/*
A RootHierarchical has no parents. It does, however, have
children whose parents are RootHierarchicals and whose children
are Child.
A parent can be none (Requirement 1)
*/
trait RootHierarchical[Child <: Hierarchical[RootHierarchical, Child]]
extends Hierarchical[None.type, Child] {
override val parents = None
}
IntelliJ , , , :
import org.scalatest.FlatSpec
class TestHierarchy extends FlatSpec {
"A Hierarchical object" should "be constructable" in {
class DummyHierarchical(override val parents: List[DummyParentHierarchical])
extends Hierarchical[DummyParentHierarchical, DummyHierarchical]
class DummyParentHierarchical extends RootHierarchical[DummyHierarchical]
val dummyParent = new DummyParentHierarchical
val dummyChild = new DummyHierarchical(List(dummyParent))
dummyParent.addChild(dummyChild)
assert(dummyParent.parents.isEmpty)
assert(dummyParent.children.nonEmpty)
}
}
:
Error:(14, 11) type arguments [None.type,Child] do not conform to trait Hierarchical type parameter bounds [Parent <: Hierarchical[Parent,Child],Child <: Hierarchical[Parent,Child]]
extends Hierarchical[None.type, Child] {
: ? , None.type Hierarchical, ?