我被困在这里,这是我代码的当前结构:
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)。
如果这根本不可行,我会很高兴有任何关于如何处理这个问题的建议。
答案 0 :(得分:0)
如果这根本不可行,我会很高兴有任何关于如何处理这个问题的建议。
你的任何一次尝试都不会奏效。第一个不起作用,因为BaseInterface<Tparam>
不是协变的,并且因为你提到它需要TParam
个对象作为某些方法或属性的输入,所以它不能是协变的。
第二个不起作用,因为没有定义非通用BaseInterface
接口。你可以定义一个包含非泛型属性和方法的文件(或者只使用AbstractInterface
)。
也可以这样考虑一下 - 假设你有一个可以包含BaseInterface<paramUser>
或BaseInterface<paramServer>
的变量,并且该接口有一个返回泛型参数类型对象的方法。在编译时你怎么知道方法的结果类型是什么?它可以是paramUser
或paramServer
。如果答案是“他们都继承自paramBase
,那么我只会将其视为”,那么只需使您的基础界面非通用并返回paramBase
。