如何在没有协变的情况下继承是合理的? (C#)

问题描述:

我对C#很陌生,但我有很好的C++知识。从C++我用这样的东西是这样工作的:如何在没有协变的情况下继承是合理的? (C#)

class Base1 {}; 
class Derived1 : Base1 {}; 
class Base2 { 
    Base1 foo(); 
}; 
class Derived2 { 
    Derived1 foo(); 
}; 

我知道在术语协方差。这段代码可能会错过一些东西,但我希望你能得到我想说的。 由于我试图在C#中用override和stuff来产生类似的东西,Compiler抱怨说类型必须相同。像这样:

class Base1 {}; 
class Derived1 : Base1 {}; 
class Base2 { 
    Base1 foo(); 
}; 
class Derived2 { 
    Base1 foo(); 
}; 

可能导致任何问题? 当然,因为我是函数foo的程序员,我可以保证总会有一个返回的Derived1。但是任何人打电话给我的功能都不知道。

我有一个项目,我有一些经理类,为此我想使用接口IManager(它是我自己的类,如果存在任何具有该名称的.NET中没有任何.NET类),因为它们都必须例如实现一个Load()方法。 Load()总是返回一个由该特定管理器管理的对象。 如果每个管理器实现iManager中,所有的人都将获得接口

ManagableObject Load(); 

那是好,是坏?或者更好,有没有解决方法?

我也看了,它与模板的工作,但只有这样我猜:

List<Base1> myList; 
myList.push_back(new Derived1()); 

或者,我可以在课堂上Derived2的使用List作为返回类型于Base1和列表?那也可以。

感谢和问候, Expecto

+0

没有什么不对您的第一套类定义是(除了需要方法的实现) - 所以我想你可能在你的解释中错过了一些东西。你得到什么编译器错误? – 2012-07-23 05:08:22

+0

C#实际上支持各种地方的协方差;然而_covariant返回values_不被支持,我相信你是在这里之后。您的样品目前也显示出实际问题。 – rjnilsson 2012-07-23 05:55:42

+0

@RJLohan in English它的意思是:“返回值必须是ManagableObject以匹配覆盖的方法IManager.Load()” – 2012-07-23 09:28:43

这就是我的意思:Does C# support return type covariance?,但我不知道去寻找长期回报类型的协方差

您需要使用新的关键字来声明你的方法。

class Derived2 { 
    new Derived1 foo(); 
}; 
+0

使用新修饰符可以显式隐藏从基类继承的成员。要隐藏继承的成员,请使用相同名称在派生类中声明它,然后使用新修饰符对其进行修改。 (http://msdn.microsoft.com/en-us/library/51y09td4%28v=vs.71%29.aspx#vclrfnew_newmodifier)当class base {void test(){}} class derived derived:base {new void test(){}}(new仅用于隐藏基本方法,没有新的关键字编译器只产生警告消息,但代码是可编译和可执行的) – ASpirin 2012-07-23 06:01:26