我有一个像这样声明的抽象类BaseItem:
public abstract class BaseItem
{
public BaseItem Parent { get; protected set; }
public List<BaseItem> Children = new List<BaseItem>();
public abstract string Function1();
}
Run Code Online (Sandbox Code Playgroud)
基本上,我正在尝试实现一个设计,其中每个Item都有一个特定类型的父级和不同类型的子级.
例如,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>
{
}
Run Code Online (Sandbox Code Playgroud)
所以有两件事.这是一个好设计吗?这样做有更简单/更好的方法吗?我真的不喜欢使用第二个抽象基类只是为了能够使用泛型.如果我确实这样做,处理目的的最佳方法是什么?(即ItemA在我的实际问题域中没有父级,但它需要父级进行编译.ProjectD没有子级,但我需要给它一些东西)
如果我没理解错的话,你是说ItemA没有父母也ItemD没有孩子,对吗?老实说,我可能只会声明具有正确类型的父/子属性的单独类:
public abstract class AbstractBase\n{\n public abstract string Function1();\n}\n\npublic class ItemA : AbstractBase\n{\n public List<ItemB> Children = new List<ItemB>();\n}\npublic class ItemB : AbstractBase\n{\n public ItemA Parent { get; protected set; }\n public List<ItemC> Children = new List<ItemC>();\n}\npublic class ItemC : AbstractBase\n{\n public ItemB Parent { get; protected set; }\n public List<ItemD> Children = new List<ItemD>();\n}\npublic class ItemD : AbstractBase\n{\n public ItemC Parent { get; protected set; }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n您在这里唯一重复的是Parent和Children属性/字段。您可以在AbstractBase. (当然,除非该功能需要访问父/子 \xe2\x80\x94 但随后你 \xe2\x80\x99 即使在你的解决方案中也回到了第一个方向。)