【发布时间】:2010-08-03 01:38:16
【问题描述】:
我有一个抽象类 BaseItem 声明如下:
public abstract class BaseItem
{
public BaseItem Parent { get; protected set; }
public List<BaseItem> Children = new List<BaseItem>();
public abstract string Function1();
}
基本上,我正在尝试实现一种设计,其中每个项目都有一个特定类型的父项和不同类型的子项。
例如,ItemA 将具有所有 ItemB 类型的子项。然后 ItemB 将有一个 ItemA 类型的父项和所有 ItemC 类型的子项。 ItemC 将有 ItemB 的父项和 ItemD 类型的子项。
我认为使用泛型来避免不必要的强制转换会更简洁,因为我知道我的每个继承类的父类和子类将是什么类型。所以我想出了这样的事情:
public abstract class AbstractBase
{
public abstract string Function1();
}
public abstract class BaseItem<T1, T2> : AbstractBase
where T1 : AbstractBase
where T2 : AbstractBase
{
public T1 Parent { get; protected set; }
public List<T2> Children = new List<T2>();
}
public class ItemA : BaseItem<ItemA, ItemB>
{
}
public class ItemB : BaseItem<ItemA, ItemC>
{
}
public class ItemC : BaseItem<ItemB, ItemD>
{
}
public class ItemD : BaseItem<ItemC, ItemD>
{
}
所以有两件事。 1. 这是一个好的设计吗?有没有更简单/更好的方法来做到这一点?我真的不喜欢仅仅为了能够使用泛型而使用第二个抽象基类。 2. 如果我保留这个,处理末端的最佳方法是什么? (即 ItemA 在我的实际问题域中没有父级,但它需要父级来编译。ItemD 没有子级,但我需要给它一些东西)
【问题讨论】:
-
这个问题让我想用 FORTRAN。
-
您的代码示例有
public class ItemC : BaseItem<ItemB, ItemC>,但您的意思可能是public class ItemC : BaseItem<ItemB, ItemD>。