Я хочу определить специальный вид кнопки, которая допускает только две возможные метки: «ВКЛ» и «ВЫКЛ». Я решил унаследовать от 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"!
Общая идея мира ОО состоит в том, чтобы в подобных случаях использовать композицию вместо наследования.
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.
...
}
Но для того, чтобы кнопка "жива" в форме, она должна наследоваться от какого-то специального класса. Я посмотрел на Control, но, похоже, уже определено свойство Text. Я предполагаю, что идеальной ситуацией будет наследование от некоторого класса, у которого даже не будет определено свойство Text, но в котором будут доступны свойства position, size и т. Д. Выше в иерархии, после Control, у нас есть Component, но это выглядит как действительно необработанный класс.
Есть какие-нибудь подсказки о том, как этого добиться? Я знаю, что это был длинный пост: (
Спасибо