如何隐藏继承的财产?

时间:2018-02-07 19:33:59

标签: c# .net class inheritance properties

我正在尝试创建一个继承自另一个我无法访问的类的类。

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;

有没有办法让这两个最后的陈述无效?

2 个答案:

答案 0 :(得分:4)

您可以使用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;
    }
}

答案 1 :(得分:1)

继承是继承。如果你的父母为你传递了蓝眼睛的特性,那么这个特性就在你的遗传密码中。但这并不代表你有蓝眼睛。当你继承这个特性时,你可能会有棕色的眼睛(显性特征),因此你表达了这个特征。

代码的工作方式类似。如果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,我知道我可以像标签一样使用它。然后,当我这样做时:

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

......然后我会花一个小时试图找出为什么myLanta的文字总是"不是!"这就是为什么在这里抛出异常很重要,或者至少使用摘要,所以当另一个人编码时,他们可以一目了然地看到无论他们分配什么" Text",它永远是" Nope"。

我的建议是,如果您需要缩小类的可用属性,使该类成为新类的一个组件而不是继承它

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而导致代码损坏,因为该继承合同将不存在。