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

本文关键字:继承 实例化 父类 类型 基类 泛型 是否 | 更新日期: 2023-09-27 18:36:51

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

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 
    } 
}

所以我的问题是,如果有办法这样做。我想生成新的接口,如服务器接口或客户端接口等,它们都继承自 BaseInterface。它们中的每一个在创建时都采用不同的参数,这就是我将它们转移到各个类的原因。

所以我不想要的是

BaseInterface<paramUser> CurrentInterface = new UserInterface();

这有效,因为我无法再将当前接口设置为服务器接口(它需要参数服务器)。

如果这根本不可行,我将很乐意就如何处理此问题提供任何建议。

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

如果这根本不可行,我将很乐意就如何处理此问题提供任何建议。

您的任何一次尝试都不起作用。 第一个不起作用,因为BaseInterface<Tparam>不是协变的,并且由于您提到它在某些方法或属性中将TParam对象作为输入,因此它不能是协变的。

第二个将不起作用,因为没有定义非泛型BaseInterface接口。 您可以定义一个包含非泛型属性和方法(或仅使用 AbstractInterface )。

也可以这样想 - 假设你有一个可以保存BaseInterface<paramUser>BaseInterface<paramServer>的变量,并且该接口有一个返回泛型参数类型的对象的方法。 在编译时如何知道该方法的结果类型是什么? 它可以是paramUser,也可以是paramServer。 如果答案是"它们都继承自paramBase所以我就这样处理它",那么只需使您的基本接口非通用并返回paramBase