![](/img/trans.png)
[英]How to hide an inherited property in a class without modifying the inherited class (base class)?
[英]How to hide inherited property?
我正在嘗試使一個類繼承自另一個我無權訪問的類。
public class MyLabel : Label
{
public MyLabel()
{
base.Text = "This text is fixed";
base.BackgroundColor = Color.Green;
}
}
像這樣調用時, Text
和Visible
屬性仍然可用:
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.