gpt4 book ai didi

c# - 从基于泛型类但需要派生类的类类型的类继承

转载 作者:太空宇宙 更新时间:2023-11-03 20:42:17 42 4
gpt4 key购买 nike

我有一个问题,但不太确定如何解决它..

考虑类:

public class BaseClass<T>
{

public T PreviousInstance { get; set; }

}

现在我的辅助数据类:

public class DataClass : BaseClass<DataClass>
{
public bool ABoolProperty { get; set; }
}

因此,当从更改事件填充时,我有 DataClass(当 WMI 对象更改时通过 LINQ To WMI 桥填充)提供更改的数据和编辑之前的先前数据,效果很好。我现在有第三堂课:

public class DerivedDataClass : DataClass
{
public string AStringProperty { get; set; }
}

我的问题是 DerviedDataClass.PreviousInstance 仍然是 DataClass 类型,这意味着我不会获得在 DerivedDataClass 中声明的 PreviousInstance 的任何属性。

我考虑过声明DataClass即

public class DataClass<T> : BaseClass<T>

这将允许 DerivedDataClass 的属性在 PreviousInstance 中可用。但是我仍然需要能够自己使用 DataClass 而不必像这样声明它:

DataClass<DataClass<object>>

只是让它工作,我真正想要的是拥有类的通用版本和非通用版本,而不必声明 2 个具有相同属性的独立类。

有什么想法吗? :)

最佳答案

继承层次结构是为了模拟“我可以在任何需要基类实例的地方使用派生类实例”的概念,对吗?如果您有一个接受 Fruit 的方法,那么您可以将 Apple 传递给它并且知道不会有任何问题。

让我们简化您的代码。你有

class B<T>
{
public T Another { get; set; }
}
class Fruit : B<Fruit> {}
class Apple : Fruit {}
class Orange : Fruit {}

现在,Apple.Another 属于 Fruit 类型,而不是 Apple 类型。它必须是 Fruit 类型,因为你可以有一个方法

void AddAnOrange(Fruit f)
{
f.Another = new Orange();
}

这必须有效即使你传入一个苹果——Fruit 的契约是一个Fruit 指代任何其他Fruit,而不是“一个fruit 指代另一种直到运行时才知道的派生类型的结果。

如果您需要对“一个苹果指另一个苹果,一个橙子指另一个橙子”的关系建模,那么不要说“一个水果指另一个水果”;那没有捕捉到你想要正确建模的东西,只会让你以后痛苦。

关于c# - 从基于泛型类但需要派生类的类类型的类继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2058882/

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