具有多个子级的通用基类

时间:2013-06-25 13:31:16

标签: 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>的{​​{1}}。我想知道是否有一种方法可以将Results移动到基类或接口中,以便在构造基类时我可以为Results提供泛型类型。例如,如果我可以这样做,那将是非常棒的:

Subject

甚至更好,因为只有一个模板参数与ChildA匹配,如果我构建它时可以为我照顾:

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

我现在卡住了尝试实现这一点,好像我尝试将结果移动到基类中,主题需要一个我无法提供的模板参数。可能有超过2个派生类,我不喜欢扩展此系统的人必须知道手动将结果添加到每个子类的想法。

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

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

这不再有效,因为 public void ProcessBaseClass(BaseClass base) { // base could be ChildA or ChildB here } 现在需要一个类型参数。有什么方法可以让我在这里拥有两全其美的优势,还是因为我的设计选择而陷入困境?

2 个答案:

答案 0 :(得分:6)

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

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

public class ChildA : BaseClass<AssociatedClassA> {
}

public class ChildB : BaseClass<AssociatedClassB> {
}

答案 1 :(得分:4)

您可以使基类本身通用:

public class BaseClass<T> {
    public T Results { get; protected set; }
}