繁体   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