是否可以将泛型基类的继承实例化为父类的类型?

时间:2016-03-01 16:08:46

标签: c# generics inheritance

我被困在这里,这是我代码的当前结构:

public abstract class AbstractInterface { }

public abstract class paramBase { }

public class paramUser : paramBase { }

public class paramServer : paramBase { }


public abstract class BaseInterface<Tparam> : AbstractInterface where Tparam : paramBase
{
    //do something
}

public class UserInterface : BaseInterface<paramUser>
{
    //do Something
}

public class ServerInterface : BaseInterface<paramServer>
{
    //do something
}

现在我想将另一个类的变量设置为特定的接口类型

public class A
{
    protected BaseInterface<paramBase> CurrentInterface;

    protected void Initialize()
    {
        CurrentInterface = new UserInterface();
        //This fails

        BaseInterface CurrentInterface_2 = new UserInterface();
        //Fails as well, because BaseInterface requires 1 type argument 
    } 
}

所以我的问题是,如果有办法甚至这样做。 我想生成新的接口,如ServerInterface或ClientInterface等,它们都继承自BaseInterface。他们每个人在创作时都采用不同的参数,这就是我将它们转移到各个班级的原因。

所以我不想要的是

BaseInterface<paramUser> CurrentInterface = new UserInterface();

哪个有效,因为我无法将CurrentInterface设置为ServerInterface(它接受paramServer)。

如果这根本不可行,我会很高兴有任何关于如何处理这个问题的建议。

1 个答案:

答案 0 :(得分:0)

  

如果这根本不可行,我会很高兴有任何关于如何处理这个问题的建议。

你的任何一次尝试都不会奏效。第一个不起作用,因为BaseInterface<Tparam>不是协变的,并且因为你提到它需要TParam个对象作为某些方法或属性的输入,所以它不能是协变的。

第二个不起作用,因为没有定义非通用BaseInterface接口。你可以定义一个包含非泛型属性和方法的文件(或者只使用AbstractInterface)。

也可以这样考虑一下 - 假设你有一个可以包含BaseInterface<paramUser>BaseInterface<paramServer>的变量,并且该接口有一个返回泛型参数类型对象的方法。在编译时你怎么知道方法的结果类型是什么?它可以是paramUserparamServer。如果答案是“他们都继承自paramBase,那么我只会将其视为”,那么只需使您的基础界面非通用并返回paramBase