1

私はこのような仮想の村のプロジェクトに取り組んでいます。50人の男性と50人の女性が年をとり、ランダムに誰かと結婚し、子供がいて、80歳に達すると死に始めます。私は人間と呼ばれる抽象的なc#クラスを持っています:

abstract class Human
{
    enum GenderType { Male, Female };

    int Age;
    bool Alive;
    string Name;
    GenderType Gender;

    Human Father;
    Human Mother;
    Human Partner;
    Human[] Children;

    public abstract bool Check(ref List<Human> People, int Index);
}

男と女と呼ばれる人間のクラスからの2人の子供。私の質問は、男性/女性クラスのCheckメソッドをオーバーライドして、結婚することが違法である女性/男性の親戚を検出できるようにする方法です。たとえば、母親、姉妹、叔母、法律上の姉妹、法律上の母親などです。

4

1 に答える 1

2

個人的には、さまざまな関係の基本クラスにヘルパープロパティを追加します。高レベルのコードを非常に簡単に理解できるようにします。必要に応じて、さまざまな関係に新しいヘルパー/プロパティを追加するだけです。

このようなもの:

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リストの代わりにこれを使用して多くのことを行うことができますが、ターゲットオーディエンスも考慮する必要があります:)

于 2012-05-31T11:11:58.870 に答える