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

标签 c# generics

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

考虑类:

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/

相关文章:

c# - 如何使用 json.net 将数据表转换为 json 字符串?

java - Mockito 转换为泛型

java - 在泛型类中实现 compareTo() 方法

c# - ildasm 和 .ldarg - 里面发生了什么?

c# - 在 C# 中以编程方式检查 XML 文件格式是否正确的最快方法是什么?

c# - 将数字转换为Barcode Ean 13并将其作为图像保存到sql中

c# - 基于带有滑动手势的对象方向的光线转换

generics - 试图理解 F# 中的 Choice 类型

generics - TypeScript:在泛型类中将泛型类型作为参数传递

java - 为什么 null 被称为 "a subtype of every reference type"?