4

したがって、子クラスを派生させる抽象基本クラスをセットアップしたいと考えています。すべての作業は子供たちで行われますが、子供たちがお互いを参照できるようにしたかったのです。

ここにいくつかの疑似コードがあります:

public abstract class BaseClass<T> : SomeOtherClass {

    public List<BaseClass> listOfChildren;

    protected T thisChild;

    public void DoMoreStuff(){
        Debug.Log("Doing more stuff");
    }

    protected virtual void DoSomething(int i){
        listOfChildren[i].DoMoreStuff();
    }
}

public class FirstChildClass : BaseClass<FirstChildClass> {

    FirstChildClass<T>(){
        thisChild = this;
    }

    public void FirstClassStuff(){
        Debug.Log("first class stuff");
    }

}
public class SecondChildClass : BaseClass<SecondChildClass> {

    public void SecondClassStuff(){
        Debug.Log("second class stuff");
    }
}

子クラスを受け入れるジェネリック List を作成するにはどうすればよいですか?

DoMoreStuff() を使用するには、listOfChildren を T で型キャストする必要がありますか?

それ自体で、このセットアップに本質的に何か問題はありますか?

4

2 に答える 2

6

私はあなたが解決策を過度に複雑にしていると思います。各ノードにデータを保存したくない場合は、ジェネリックを使用せずにこの問題を解決してみてください。出発点として、望ましい動作の単純で簡単な実装を提供します。

public abstract class BaseClass  {

    private IList<BaseClass> children = new List<BaseClass>();

    public void AddChild(BaseClass child)
    {
        this.children.Add(child);
    }

    protected virtual void DoMoreStuff(){
        Debug.Write("Doing more stuff");
    }

    public void DoSomething(int i){
        children[i].DoMoreStuff();
    }
}

public class FirstChildClass : BaseClass {

    protected override void DoMoreStuff(){
        Debug.Write("first class more stuff");
    }

}

public class SecondChildClass : BaseClass {

    protected override void DoMoreStuff(){
        Debug.Write("second class more stuff");
    }
}

今、あなたはすることができます

var root = new FirstChildClass();

root.AddChild(new FirstChildClass());
root.AddChild(new SecondChildClass());
root.AddChild(new FirstChildClass());

root.DoSomething(1); //will print second class more stuff
root.DoSomething(0); //will print first class more stuff
于 2013-04-16T21:04:41.260 に答える
3

子クラスと子データを分離する必要があります。子クラスは、その親から単純に継承して、より詳細な構造をデータ ( や などAnimal)に提供しDogます。一方、子データは、データが表すものは何でも互いに関連していることを意味します ( と などReceipt) ReceiptLineItem

通常、この 2 つが重なることはありません。クラスはクラスのReceiptようには見えずReceiptLineItemReceiptと aExternalPurchaseOrderは、両方とも から構造を継承していますが、互いに何の関係もありませんPurchase。それらが重なると、ツリー構造になります。AProductは、より多くProductの で構成されている場合があり、それぞれがさらに多くProductの で構成されている場合があります。


最初のタイプの継承 (クラス構造) を探していると仮定して、コードを次のように書き直します。

public abstract class BaseClass : SomeOtherClass {

    public static List<BaseClass> listOfChildren = new List<BaseClass>();

    public void DoMoreStuff(){
        Debug.Log("Doing more stuff");
    }

    protected virtual void DoSomething(int i){
        listOfChildren[i].DoMoreStuff();
    }
}

public class FirstChildClass : BaseClass {

    FirstChildClass(){
       // Set some things unique to this class
    }

    public void FirstClassStuff(){
        Debug.Log("first class stuff");
    }

}
public class SecondChildClass : BaseClass<SecondChildClass> {

    public void SecondClassStuff(){
        Debug.Log("second class stuff");
    }
}

その後、マスター リストに としてアクセスできますBaseClass.listOfChildren。すべての子を自動的に登録したい場合は、それをBaseClassコンストラクターに追加できます。

protected BaseClass()
{
   listOfChildren.Add(this);
}
于 2013-04-16T21:04:01.357 に答える