所以我希望设置一个抽象基类来从中派生子类。所有工作都将在孩子们身上进行,但我希望孩子能够互相参考。
这是一些伪代码:
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()?
就此而言,此设置还有其他任何内在错误吗?
答案 0 :(得分:4)
我认为你过度合成了解决方案。如果您不想在每个节点中存储任何数据 - 尝试在没有泛型的情况下解决此问题。我将以天真直接的方式实现所需行为作为起点。
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
答案 1 :(得分:3)
您需要将子类与子数据分开。子类只是从其父类继承,以便为数据提供更详细的结构(例如Animal
和Dog
)。另一方面,子数据意味着代表的数据彼此相关(例如Receipt
和ReceiptLineItem
)。
通常,两者不重叠。 Receipt
类看起来与ReceiptLineItem
类完全不同,Receipt
和ExternalPurchaseOrder
彼此无关,即使它们都从{{{{}}继承了它们的结构1}}。当它们重叠时,你有一个树形结构。 Purchase
可以由更多Product
s组成,每个Product
可以由更多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);
}