2011-03-22 16 views
1
/// <summary> 
/// Holds data associated with a label 
/// </summary> 
public class ArtworkDataLabel : ArtworkLabel 
{ 
    public string Data { get; set; } 
    public int ID { get; set; } 

    public ArtworkDataLabel() 
    { 
     this.ID = 5; 
    } 
}  

/// <summary> 
/// A template label 
/// </summary> 
public class ArtworkLabel 
{ 
    public int ID { get; set; } 
    snip 
} 

這使我困惑,爲什麼編譯器允許這個,以及哪個ID被設置?我如何在ID之間區分?我應該將其中一個ID重命名爲其他東西嗎?c#類繼承,哪個ID是這個設置?

+0

你真的需要*兩個* ID嗎?如果是這樣,他們不是不同的東西?有什麼不同?這可能有助於選擇更好的名字。如果它們一樣,你只需要一個。 – 2011-03-22 17:03:21

+2

我發現始終使用「將警告視爲錯誤」標誌進行編譯很有用;我相信這會阻止你做這樣的事情=) – Eyvind 2011-03-22 17:04:21

回答

3

你是隱藏屬性的基類,含蓄地使用new運算符:

public new int ID { get; set; }

它覆蓋的方法。

1

你可能會發現,如果你建立它,你有警告,表明你有一個'隱藏'或'陰影'的成員,但我不認爲(默認情況下,至少)它會標記作爲一個硬編譯器的錯誤。

要啓用此方案,所以沒有混亂,你應該在基類的「虛擬」標記ID屬性,並在子類中你「超越」​​了:

public class ArtworkDataLabel : ArtworkLabel 
{ 
    public string Data { get; set; } 
    public override int ID { get; set; } 

    public ArtworkDataLabel() 
    { 
     this.ID = 5; 
    } 
}  

public class ArtworkLabel 
{ 
    public virtual int ID { get; set; } 
} 
0

是的,你應該重命名它們或使用'新'modifier。您獲得的ID始終是繼承類中的ID,而不是父類的ID。

2

它隱藏基類的成員並設置子類的ID。

1

這裏發生的事情是,在ArtworkDataLabelArtworkLabel宣佈ID宣佈ID。如果您檢查視覺工作室,您會看到這會生成警告。如果您打算隱藏的該屬性,您可以使用關鍵字new如下:

public new int ID {get;set;} 

這裏的an article是詳細介紹了此功能。

希望這有助於:)

1

ArtwordDataLabel.ID隱藏ArtworkLabel.ID,你應該看到一個編譯器警告你,這種情況正在發生,那麼你應該用「新」,表明這是故意的。通過將屬性更改回傳統屬性幷包括一些跟蹤日誌記錄來觀察行爲是非常容易的。

我認爲這裏更大的問題是繼承是否是這些類的正確結構。根據你想要用這些類來做什麼,你可能會發現使用裝飾器模式或者甚至完全分開它們更合適。