C#通用父对象引用,可以带任何子对象

时间:2018-12-27 04:54:30

标签: java c# generics wildcard

我有一个通用类,该类已经被几个子类扩展了。

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所建议,使用另一个接口允许使用单个引用保存子对象,但是由于该接口不包含在父类中定义的必需的通用方法,因此它并不是真正有用的

0 个答案:

没有答案