c# - 具有多个 child 的通用基类

标签 c# generics polymorphism

我目前有一个小的对象层次结构,如下所示:

public class BaseClass {
    // this class is empty and exists only so the others can extend it and share the
    // same base type
}

public class ChildA : BaseClass {
    public Subject<AssociatedClassA> Results;
}

public class ChildB : BaseClass {
    public Subject<AssociatedClassB> Results;
}

在我的设计中,我想强制每个从 BaseClass 扩展的类应该包含 Subject<SomeType>称为 Results .我想知道是否有一种方法可以将 Results 移动到基类或接口(interface)中,以便我可以为 Subject 提供泛型类型在构建基类时。例如,如果我能做这样的事情就太棒了:

ChildA<AssociatedClassA> instance = new ChildA<AssociatedClassA>();

或者更好,因为当我构造它时,实际上应该只有一个与 ChildA 匹配的模板参数可以为我处理:

ChildA instance = new ChildA();
// Results is automatically set to Subject<AssociatedClassA>

我现在一直在尝试实现它,就好像我试图将 Results 移动到基类中一样,Subject 需要一个我不一定能提供的模板参数。可能有超过 2 个派生类,我不喜欢扩展此系统的人必须知道将结果手动添加到每个子类的想法。

按照下面 2 个答案的建议,这解决了我将 Results 移入基类的愿望,但是我遇到了另一个问题,因为我希望能够使用 BaseClass 作为方法的通用参数,这样可以使用任何派生类。例如:

 public void ProcessBaseClass(BaseClass base) {
     // base could be ChildA or ChildB here
 }

这不再适用于 BaseClass现在需要一个类型参数。有什么方法可以让我两全其美,还是因为我的设计选择而陷入困境?

最佳答案

如果合适,您可以使父级通用:

public class BaseClass<T> {
    public Subject<T> Results;
}

public class ChildA : BaseClass<AssociatedClassA> {
}

public class ChildB : BaseClass<AssociatedClassB> {
}

关于c# - 具有多个 child 的通用基类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17298730/

相关文章:

c# - Silverlight Deepzoom API 输出与 Deepzoom Composer 输出

c# - 在 C# 中处理 UAC 的正确方法

java - ApplicationBinder 中泛型类型的 JAX-RS Bind 实现

c++ - boost::any 违反了 Liskov 替换原则

c# - 什么是虚多态?

c# - 将图表系列数据复制到另一个图表

c# - 对话框窗口 MVVM 方式

C++ new []在数组访问时进入基类指针崩溃

c# - 具有 Type<T> 可为空值的 <T> 类型的类

C# 语法——用逗号将字符串拆分为数组,转换为通用列表,并反转顺序