使用Generic c#的Child

时间:2014-04-16 19:43:34

标签: c# generics inheritance

我有一个抽象的Generic类,定义如下

abstract public class X<T>

用一组共同祖先的孩子实例化,即

public class Y : X<Bar>
public class Z : X<Baz>

Bar和Baz是Foo的孩子。有没有办法创建一个类

public class W : X<Foo>

这样我就可以将W,X,Y,Z存储在诸如

之类的对象中
A<Foo>

编辑: 需要指出的是,我无法改变基础结构。我的选择是以这样的方式实现,或者为Foo的所有孩子创建一个单独的重复类。

2 个答案:

答案 0 :(得分:3)

没有。您要求的是这些类型与此通用参数的协变性。类的泛型参数永远不会是协变的。 interfaces 的泛型参数可能可能是协变的,如果接口被定义为协变,并且泛型参数仅用于庄园,确保所有此类程序都可以静态验证了类型安全。

答案 1 :(得分:0)

通过引入和使用协变接口IX<T, TBase>,您可以执行此操作。

public class Foo { }

public class Bar : Foo { }   
public class Baz : Foo { }

public interface IX<out T, TBase> where T : TBase { }

public abstract class X<T, TBase> : IX<T, TBase> where T : TBase { }

public class Y : X<Bar, Foo> { }
public class Z : X<Baz, Foo> { }
public class W : X<Foo, Foo> { }

现在以下代码有效。

IX<Foo, Foo> x;

x = new Y();
x = new Z();
x = new W();

如果TBase已修复,您当然可以删除第二个类型参数TBase并直接使用Foo。无论如何,有趣的部分是提取协变接口IX<T, TBase>,这可能并不容易但应该是可能的。