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");
    }
}

我将如何制作一个通用列表来接受任何子类?

我是否需要使用 T 对 listOfChildren 进行类型转换才能使用 DoMoreStuff()?

就其本身而言,此设置是否存在其他固有问题?

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

您需要将子和子数据分开。子类简单地从其父类继承,为数据提供更详细的结构(例如AnimalDog)。另一方面,子数据意味着数据所代表的任何内容都彼此相关(例如ReceiptReceiptLineItem)。

通常,两者不会重叠。该类Receipt看起来与ReceiptLineItem该类完全不同,并且 theReceipt和 aExternalPurchaseOrder彼此没有任何关系,尽管它们都继承了它们的结构Purchase。当它们重叠时,你就有了一个树形结构。AProduct可以由更多Product的 s 组成,每个 s 又可以由更多Product的 s 组成。


假设您正在寻找第一种继承类型(类结构),这是我重写代码的方式:

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 回答