簡體   English   中英

如何隱藏繼承的財產?

[英]How to hide inherited property?

我正在嘗試使一個類繼承自另一個我無權訪問的類。

public class MyLabel : Label
{
    public MyLabel()
    {
        base.Text = "This text is fixed";
        base.BackgroundColor = Color.Green;
    }
}

像這樣調用時, TextVisible屬性仍然可用:

MyLabel lbl = new MyLabel();
lbl.Text = "Nope.";
lbl.BackgroundColor = Color.Red;

有沒有辦法使最后兩個語句無效?

您可以使用new關鍵字隱藏繼承的屬性,並將它們重新定義為只讀。

public class MyLabel : Label
{
    new public string Text { get { return base.Text; } }
    new public string BackColor { get { return base.BackColor; } }

    public MyLabel()
    {
        base.Text = "This text is fixed";
        base.BackColor= Color.Green;
    }
}

繼承就是繼承。 如果您的父母通過了您的藍眼睛特征,則該特征已存在於您的遺傳密碼中。 不過,這並不意味着您有藍眼睛。 繼承特質時,您可能會擁有棕色的眼睛(特質),因此您可以表達該特質。

代碼的工作方式與此類似。 如果foo繼承自bar ,則每個foo都將具有bar的特征。 但是,您可以做的是用類特有的特征覆蓋特征。

  public override string Text
  {
            get { return "Nope"; }    
            set { return; /*or throw an exception or whatever you want to do*/ }
  }

現在,我向您展示了如何操作,如果可以避免,請不要這樣做。 如果您擔心繼承諸如Label類的復雜對象,並且不想公開它繼承的某些內容,則問題可能與屬性上的修飾符無關,而與范圍修飾符無關在您的實際實例上。 您最好在更窄的范圍內使用該對象,然后讓它超出范圍,然后其他任何對象才能訪問它。

您想要避免這種情況的原因是代碼異味。 假設您制作了一個使用MyLabel類庫。 因為它繼承自Label ,所以我知道它可以像Label一樣使用。 然后,當我這樣做時:

MyLabel myLanta = new MyLabel();
myLanta.Text = "Oh!";

...然后,我將繼續花費一個小時,試圖找出為什么myLanta的文字始終為“不!”。 這就是為什么在這里拋出異常或至少使用摘要很重要的原因,這樣,當另一個人在編碼時,他們一眼就能看出,無論為“文本”分配什么,始終為“否”。

我的建議是,如果您需要縮小一個類的可用屬性, 請將該類作為新類的組成部分,而不要繼承它

public class MyLabel
{
    private System.Windows.Forms.Label label 
    = new System.Windows.Forms.Label { Text = "Nope", BackColor = Color.Green };
    //a public accessor and setter
    public Font Font { get { return label.Font; } set { label.Font = value; } }     
    //only this class can set the color, any class can read the color
    public Color ForeColor { get { return label.ForeColor; } private set { label.ForeColor = value; } }
    public AllMyStuffIWantToDo()....
    //fill in your stuff here
}

然后,如果要返回Label屬性,則可以使用自己控制的方法和屬性,而不必擔心繼承問題。 如果您不提供對Label的屬性的訪問方法,則該屬性永遠不會消失,實際上是該類的私有屬性。 這還可以防止他人通過MyLabel代替Forms.Label破壞代碼,因為該繼承協定不存在。

暫無
暫無

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

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