我有一个通用类,该类已经被几个子类扩展了。
class Parent<T>
{
public T test;
protected Parent(T test)
{
this.test = test;
}
}
class ChildA : Parent<int>
{
public ChildA(int test) : base(test)
{
}
}
class ChildB : Parent<string>
{
public ChildB(string test) : base(test)
{
}
}
我要在代码中使用的子类由某些程序逻辑确定。我想要一个父容器,并将确定的子对象分配给它,以便可以使用在父类中定义的方法。
public static void Main()
{
Random rand = new Random();
Parent<dynamic> child; // parent reference ** line at question
if (rand.Next(100) > 50)
{
child = new ChildA(1);
}
else
{
child = new ChildB("A");
}
Console.WriteLine(child.test);
}
我已将引用对象中的泛型类型用作dynamic
作为占位符。编译器给出错误,提示它无法在类型之间进行隐式转换。
在Java中,您可以使用通用通配符,例如
Parent<?> child;
if(Math.random() > 0.5) {
child = new ChildA(1);
}else {
child = new ChildB("A");
}
child.print();
并且编译器可以确定子对象以运行正确的方法。如何在C#中实现类似的流程?
编辑:如此处Wildcard equivalent in C# generics所建议,使用另一个接口允许使用单个引用保存子对象,但是由于该接口不包含在父类中定义的必需的通用方法,因此它并不是真正有用的