個人的には、さまざまな関係の基本クラスにヘルパープロパティを追加します。高レベルのコードを非常に簡単に理解できるようにします。必要に応じて、さまざまな関係に新しいヘルパー/プロパティを追加するだけです。
このようなもの:
public class Human
{
...
public List<Human> Parents
{
get {return new List<Human>(){Mother, Father};}
}
public List<Human> Siblings
{
get
{
List<Human> siblings = new List<Human>();
foreach (var parent in Parents)
{
siblings.AddRange(parent.Children);
}
return siblings;
}
}
}
public class Man : Human
{
public override bool Check(ref List<Human> People, int Index)
{
// Do basic checks first
if (!base.Check(People, Index))
{
return false;
}
var person = People[Index];
// Can't marry your mother/father
if (this.Parents.Contains(person)
{
return false;
}
// Can't marry your sister/brother
if (this.Siblings.Contains(person))
{
return false;
}
// ... etc for other relationships
return true; /// Not rejected... yes you can marry them... (if they want to!)
}
}
また、男性と女性の両方に適用される基本的なチェックをHuman
クラスに入れ、最初に男性と女性のチェックから基本チェックを呼び出します(上記のコードに示されているように)。
public class Human
{
public virtual bool Check(ref List<Human> People, int Index)
{
var person = People[Index];
// Can't marry yourself!
if (this == person)
{
return false;
}
if (this.Gender == person.Gender)
{
return false; // Unless the village is New York or Brighton :)
}
if (!person.Alive)
{
return false; // Unless vampires/zombies are allowed
}
if (Partner != null)
{
return false; // Unless village supports bigamy/poligamy in which case use a collection for Partner and rename to Partners.
}
}
}
同性チェックは早い段階で行われるため、ほとんどのチェックは男性と女性に等しく適用されることがわかると思います。したがって、ほとんどのチェックはおそらく基本クラスに入りCheck
ます。
注:はい、yield return
リストの代わりにこれを使用して多くのことを行うことができますが、ターゲットオーディエンスも考慮する必要があります:)