C# 是否可以将泛型基类的继承作为父类的类型进行实例?
我被困在这里,这是我代码的当前结构:C# 是否可以将泛型基类的继承作为父类的类型进行实例?,c#,generics,inheritance,C#,Generics,Inheritance,我被困在这里,这是我代码的当前结构: public abstract class AbstractInterface { } public abstract class paramBase { } public class paramUser : paramBase { } public class paramServer : paramBase { } public abstract class BaseInterface<Tparam> : AbstractInterf
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
}
公共抽象类抽象接口{}
公共抽象类parabase{}
公共类paramUser:paramBase{}
公共类paramServer:paramBase{}
公共抽象类BaseInterface:AbstractInterface,其中Tparam:paramBase
{
//做点什么
}
公共类UserInterface:BaseInterface
{
//做点什么
}
公共类ServerInterface:BaseInterface
{
//做点什么
}
现在我想将另一个类的变量设置为特定的接口类型
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
}
}
公共A类
{
受保护的BaseInterface-CurrentInterface;
受保护的void初始化()
{
CurrentInterface=新用户接口();
//这失败了
BaseInterface CurrentInterface_2=新用户接口();
//也会失败,因为BaseInterface需要1个类型参数
}
}
所以我的问题是,是否有办法做到这一点。
我想生成新的接口,如ServerInterface或ClientInterface等,它们都继承自BaseInterface。它们中的每一个在创建时都采用不同的参数,这就是我将它们转移到各个类的原因
所以我不想要的是
BaseInterface<paramUser> CurrentInterface = new UserInterface();
BaseInterface CurrentInterface=newuserInterface();
这是可行的,因为我不能再将CurrentInterface设置为ServerInterface(需要paramServer)
如果这是不可行的,我会很高兴任何关于如何处理这个问题的建议
如果这是不可行的,我会很高兴任何关于如何处理这个问题的建议
你的两次尝试都不起作用。第一种方法不起作用,因为BaseInterface
是不协变的,并且由于您提到它在某些方法或属性中将TParam
对象作为输入,所以它不能协变
第二个将不起作用,因为没有定义非通用的BaseInterface
接口。您可以定义一个包含非泛型属性和方法的属性和方法(或者只使用AbstractInterface
)
也可以这样考虑-假设您有一个变量,可以包含
BaseInterface
或BaseInterface
,并且该接口有一个返回泛型参数类型对象的方法。在编译时,您如何知道该方法的结果类型?它可以是paramUser
或paramServer
。如果答案是“它们都是从paramBase
继承的,因此我将照此处理”,那么只需将您的基本接口设置为非泛型,并返回paramBase
如果BaseInterface
定义为,则第一次尝试将起作用,但要做到这一点,需要泛型类型仅用作输出,因此,这取决于在BaseInterface
上定义了哪些方法/属性,第二次尝试不会-没有定义的BaseInterface
接口不采用通用参数,因此,您不能创建类型为BaseInterface
的变量。您可以创建类型为AbstractInterface
的变量。@stuartd我可以这样做,但是我不能引用在我的BaseInterface中声明的方法,如ClientInterface.update()@DStanley很遗憾,我现在只把它用作输入。我希望在创建接口时,该接口能够接受委托,以便处理通知之类的事情。第二个。。我在网上找到的,但它不起作用。