簡體   English   中英

C#創建一個List以保存基類的任何派生子級

[英]C# Make a List to hold any derived children of a base class

所以我希望設置一個抽象基類來從中派生子類。 所有工作都將在孩子們身上進行,但我希望孩子能夠互相參考。

這是一些偽代碼:

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接受任何子類?

我是否需要使用T對listOfChildren進行類型轉換才能使用DoMoreStuff()?

就其本身而言,此設置還存在其他任何錯誤嗎?

我認為你過度合成了解決方案。 如果您不想在每個節點中存儲任何數據 - 嘗試在沒有泛型的情況下解決此問題。 我將以天真直接的方式實現所需行為作為起點。

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

您需要將子和子數據分開。 子類只是從其父類繼承,為數據提供更詳細的結構(例如AnimalDog )。 另一方面,子數據意味着數據表示的任何內容彼此相關(例如ReceiptReceiptLineItem )。

通常,兩者不重疊。 Receipt類看起來與ReceiptLineItem類不同, ReceiptExternalPurchaseOrder彼此無關,即使它們都從Purchase繼承了它們的結構。 當它們重疊時,你有一個樹形結構。 Product可以由更多的Product S,其中每個可以由還更的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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM