私がこのようなクラスを持っている場合:
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
セット[ArchitecturalElement]から、セット[コンポーネント]を派生させますか?一方、ComponentはArchitecturalElementから継承します。