簡體   English   中英

c#類繼承,此設置是哪個ID?

[英]c# Class inheritence, which ID is this setting?

/// <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重命名嗎?

您正在隱式使用new運算符將屬性隱藏在基類中:

public new int ID { get; set; }

覆蓋方法。

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

您可能會發現,如果您構建它時發出警告,則表明您有一個成員“隱藏”或“陰影”另一個成員,但是我認為(至少默認情況下)它不會標記為硬編譯器錯誤。

要啟用這種情況,以免引起混淆,您應該將基類中的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; }
}

這里所發生的是, ID中聲明ArtworkDataLabel 隱藏ID中聲明ArtworkLabel 如果檢查Visual Studio,您會看到這會生成警告 如果要隱藏該屬性,則可以按如下方式使用new關鍵字:

public new int ID {get;set;}

是一篇文章 ,詳細介紹了此功能。

希望這可以幫助 :)

ArtwordDataLabel.ID隱藏了ArtworkLabel.ID,您應該看到一個編譯器警告您這正在發生,並且您應該使用“ new”表示這是故意的。 通過將屬性改回傳統屬性並包括一些跟蹤日志記錄,很容易觀察到行為。

我認為,這里更大的問題是繼承是否是這些類的正確結構。 根據您要對這些類進行的操作,您可能會發現使用裝飾器模式或將它們完全分開更為合適。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM