【发布时间】:2011-02-11 16:28:06
【问题描述】:
我想定义一种特殊的按钮,它只允许两个可能的标签:“ON”和“OFF”。我决定从 Windows.Forms.Button 继承来实现这个,但现在我不知道我应该如何执行这个规则。我应该像这样覆盖 Text 属性吗?
public override string Text
{
set
{
throw new InvalidOperationException("Invalid operation on StartStopButton!");
}
}
我看到的问题是我违反了所有按钮都应该具备的合同。如果任何代码尝试类似
foreach (Button button in myForm) {
button.Text = "123";
}
如果我在表单上有我的任何特殊按钮,他们会得到一个例外,这是不可预料的。首先,因为人们认为属性只是“公共”变量,而不是方法,其次,因为他们习惯于使用和设置任何他们想要的按钮,而不必担心异常。
我应该让 set 属性什么都不做吗?这也可能导致尴尬的结果:
myButton.Text = "abc";
MessageBox.Show(abc); //not "abc"!
OO 世界的一般想法是在这种情况下使用组合而不是继承。
public class MySpecialButton : <Some class from System.Windows.Forms that already knows how to draw itself on forms>
private Button button = new Button(); //I'd just draw this button on this class
//and I'd then only show the fields I consider
//relevant to the outside world.
...
}
但要使 Button 在表单上“活动”,它必须从某个特殊类继承。我看过 Control,但它似乎已经定义了 Text 属性。我想理想的情况是从某种甚至没有定义 Text 属性的类继承,但它具有可用的位置、大小等属性。在层次结构的上层,在 Control 之后,我们有 Component,但这看起来像是一个非常原始的类。
关于如何实现这一点的任何线索?我知道这是一个很长的帖子:(
谢谢
【问题讨论】: