2

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

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. 我想知道是否有一种方法可以将结果移动到基类或接口中,这样我就可以Subject在构造基类时提供泛型类型。例如,如果我能做这样的事情会很棒:

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

甚至更好,因为实际上应该只有一个模板参数与 ChildA 匹配,如果我构建它时可以为我处理:

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

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

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

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

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

4

2 回答 2

6

如果合适,您可以将父级设为通用:

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

public class ChildA : BaseClass<AssociatedClassA> {
}

public class ChildB : BaseClass<AssociatedClassB> {
}
于 2013-06-25T13:33:14.383 回答
4

您可以使基类本身通用:

public class BaseClass<T> {
    public T Results { get; protected set; }
}
于 2013-06-25T13:32:54.927 回答