在父子关系中使用泛型

Dav*_* A. 7 c# generics

我有一个像这样声明的抽象类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没有子级,但我需要给它一些东西)

Tim*_*mwi 1

如果我没理解错的话,你是说ItemA没有父母也ItemD没有孩子,对吗?老实说,我可能只会声明具有正确类型的父/子属性的单独类:

\n\n
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}\n
Run Code Online (Sandbox Code Playgroud)\n\n

您在这里唯一重复的是ParentChildren属性/字段。您可以在AbstractBase. (当然,除非该功能需要访问父/子 \xe2\x80\x94 但随后你 \xe2\x80\x99 即使在你的解决方案中也回到了第一个方向。)

\n