2010-05-05 106 views
1

我是一名Java開發人員,我注意到在c#中擴展抽象類與Java相比存在一些差異。我想知道一個C#開發人員如何實現以下功能。在c中擴展抽象類#

1)

協變性
public abstract class A { 
    public abstract List<B> List(); 
} 
public class BList : List<B> { 
} 
public abstract class C : A { 
    public abstract BList List(); 
} 

所以在上面的層次中,有在協變性C,其中它返回兼容的類型與什麼甲回報。但是,這在Visual Studio中給了我一個錯誤。有沒有辦法在c#中指定covarient返回類型?

2)添加一個設置器,一屬性

public abstract class A { 
    public abstract String Name { get; } 
} 
public abstract class B : A { 
    public abstract String Name { get; set } 
} 

在這裏,編譯器抱怨隱藏的。有什麼建議麼?

請不要建議使用接口,除非這是唯一的方法。

+4

重寫虛擬方法時,C#不支持返回類型協方差,抱歉! – 2010-05-05 15:06:51

回答

0

不知何故,我不明白你的意圖。你爲什麼不解決這個問題?

public class BList : List<T> where T : B {} same = public class BList : List<B> {} 

public class C : A 
{ 
    public override List<B> Liste() 
    { 
     return new BList(); 
    } 
} 

關於第二個問題:

你想做的事有壞的設計在我眼裏什麼。您可以在兩者上使用關鍵字virtual並忽略警告,但您爲什麼要這樣做?

public abstract class A 
{ 
    public virtual string Name { get; protected set; } 

} 

public abstract class B : A 
{ 
    public virtual string Name { get; set;} 
} 
+0

你對我的第一個問題的回答是沒有共變的。至於第二個這是不令人滿意的。我需要兩個獨立的類型,我希望A和B沒有依賴關係。 B想要一個額外的setter方法並不重要。 – 2010-05-05 13:11:53

0

這些在C#中都不受支持。 Covariant返回在底層運行時(CLR)中也不受支持。

看來,可能可以沿着CLR上的屬性示例的行來做某些事情,但不能在C#中執行某些操作。在引擎蓋下,屬性基本上由名稱,屬性類型以及對吸氣劑和設置器方法(如適用)的引用組成,通常命名爲get_<Property>set_<Property>(但不要求遵循非CLS中的約定符合的類)。可以在僅具有getter的基類中創建屬性,然後在具有相同名稱和getter的派生類中創建另一個屬性,但該屬性具有自己的setter。但是,我不知道任何.NET語言都允許這樣的定義。

+0

甚至沒有增加一個屬性setter,我認爲屬性是添加set_ get_ 方法的語法糖? – 2010-05-05 17:30:47

+0

@ng:在CLR級別,他們實際上是這樣,但他們在高級語言中得到了一些特殊待遇。這是限制你的一種情況。 – 2010-05-06 06:07:02