gpt4 book ai didi

c# - 在父子关系中使用泛型

转载 作者:太空狗 更新时间:2023-10-29 20:37:52 25 4
gpt4 key购买 nike

我有一个抽象类 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 没有子项,但我需要给它一些东西)

最佳答案

如果我没理解错的话,你是说 ItemA 从来没有父项,而 ItemD 从来没有任何子项,对吧?老实说,我可能只用自己的正确类型的父/子属性声明单独的类:

public abstract class AbstractBase
{
public abstract string Function1();
}

public class ItemA : AbstractBase
{
public List<ItemB> Children = new List<ItemB>();
}
public class ItemB : AbstractBase
{
public ItemA Parent { get; protected set; }
public List<ItemC> Children = new List<ItemC>();
}
public class ItemC : AbstractBase
{
public ItemB Parent { get; protected set; }
public List<ItemD> Children = new List<ItemD>();
}
public class ItemD : AbstractBase
{
public ItemC Parent { get; protected set; }
}

您在这里唯一重复的是 ParentChildren 属性/字段。您可以在 AbstractBase 中实现的所有其他常用功能。 (当然,除非该功能需要访问 parent / child ——但即使在您的解决方案中,您也回到原点。)

关于c# - 在父子关系中使用泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3389228/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com