我有一个抽象的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的所有孩子创建一个单独的重复类。
答案 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>
,这可能并不容易但应该是可能的。