2012-07-23 75 views
0

我對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

回答

0

您需要使用新的關鍵字來聲明你的方法。

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

相關問題