2016-03-01 27 views
0

我在这里卡住了,这是我的代码的现有结构:是否有可能将泛型基类的继承实例化为父类的类型?

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

如果'BaseInterface'被定义为[covariant](https://msdn.microsoft.com/en-us/library/ee207183.aspx),那么第一次尝试就可以工作,但要做到这一点只需要泛型类型被用作输出,所以它取决于在BaseInterface上定义了什么方法/属性 –

+0

第二次尝试不会 - 没有定义的BaseInterface接口没有使用通用参数,所以你不能创建一个变量输入'BaseInterface'。 –

+0

虽然你可以创建一个'AbstractInterface'类型的变量.. – stuartd

回答

0

如果这不是可行的,我会很乐意提供关于如何处理这个问题的任何建议。

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

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

想想也是这样说 - 假设你有可容纳无论是BaseInterface<paramUser>BaseInterface<paramServer>一个变量,而接口有返回的泛型参数类型的对象的方法。你如何知道在编译时该方法的结果类型是什么?它可以是paramUserparamServer。如果答案是“它们都从paramBase继承,所以我只把它当作”,然后只是让你的基接口非通用并返回一个paramBase