如果我有这样的课程:
class Person (var name:String, var surname:String, var sons: Set[Person])
我想要控制一个人不能在他的儿子和他儿子的儿子之间控制自己。我怎样才能做到这一点?
我曾想过递归搜索。但我必须小心不要创造循环。我可以使用布尔值作为守卫,只要你找到一个包含自身的项目就会停止搜索。
我该如何实施?你有想法吗?非常感谢。
更新 非常感谢您的帮助。很好的答案,但最重要的是你有很好的想法。现在我只需要最后一点帮助来测试我的小项目的这个检查。
我的真实情况如下:
trait ArchitecturalElement extends PropertyHolderElement with TypedElement{}
abstract class Component extends ConnectableElement with ArchitecturalElement {
var subElements : Set[ArchitecturalElement]
var interactionPoints : Set[InteractionPoint]
//Here I put the control
//A component cannot contain himself in his subElements and in subElements of it subelement
def notHerOwnDescendant = {
def notDescendant(ancestor: Component, current: Component, checked: Set[ArchitecturalElement]): Boolean =
!current.subElements.contains(ancestor) && current.subElements.forall(
p => checked.contains(p) || notDescendant(ancestor, p, checked + p))
notDescendant(this, this, Set())
}
}//Component
abstract class InteractionPoint extends ConnectableElement{}
class SAInterface( var name : String,
var description : String = "empty",
var direction : SAInterfaceDirection = null
)extends InteractionPoint with ArchitecturalElement
class SAComponent ( var name :String,
var description : String = "empty",
var subElements : Set[ArchitecturalElement] = Set(),
var interactionPoints : Set[InteractionPoint] = Set()
) extends Component
但我有一个不兼容的类型:
类型不匹配; 找到:a0Dominio.ArchitecturalElement 所需:a0Dominio.SAComponent
p => checked.contains(p) || notDescendant(ancestor, p, checked + p)
// ^ here
从一个 Set [ArchitecturalElement],我派生一个 Set [Component]?而 Component 继承自 ArchitecturalElement。