- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个问题,但不太确定如何解决它..
考虑类:
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/
我是一名优秀的程序员,十分优秀!