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很遗憾,我现在只把它用作输入。我希望在创建接口时,该接口能够接受委托,以便处理通知之类的事情。第二个。。我在网上找到的,但它不起作用。