我正在尝试创建一个继承自另一个我无法访问的类的类。
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;
有没有办法让这两个最后的陈述无效?
答案 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
而导致代码损坏,因为该继承合同将不存在。