是否可以将泛型基类的继承实例化为父类的类型
本文关键字:继承 实例化 父类 类型 基类 泛型 是否 | 更新日期: 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
。