Я недавно начал обновлять свой проект RAD Studio 2007 до RAD Studio 2009. Одна вещь, которую я заметил, это то, что казалось бы простой код неожиданно не скомпилировался.
Пример кода:
class CButtonPopupMenu
{
// Snip
public:
void Init( TButton* SrcButton )
{
SrcButton->OnClick = OnButtonClick;
}
private:
void __fastcall OnButtonClick( TObject* Sender )
{
// Do some button click stuff
}
};
// Snip
TButton button = new TButton( this );
TBitBtn bitBtn = new TBitBtn( this );
CButtonPopupMenu popupButton = new CButtonPopupMenu( button );
CButtonPopupMenu popupBitBtn = new CButtonPopupMenu( bitBtn );
Это все используется для компиляции, но с 2009 года он терпит неудачу. Рассматривая цепочку наследования за 2007 год TBitBtn
используется для получения от TButton
. Таким образом, события, которые ожидаются в любом элементе управления кнопки (т.е. OnClick), были совместно использованы классом TButton
. Поэтому я смог относиться к своему TBitBtn
классу как TButton
.
2007 цепочка наследования:
2009 цепочка наследования:
- TBitBtn: TCustomButton
- TButton: TCustomButton
В 2009 году и TButton и TBitButton являются производными от TCustomButton , что было бы неплохо, если бы там были атрибуты, подобные кнопкам. Если бы это было так, я мог бы просто изменить код, чтобы иметь дело с TCustomButton . К сожалению, TCustomButton не содержит таких вещей, как OnClick . Поэтому я больше не могу лечить TBitBtn как TButton . Оба этих класса теперь имеют свои отдельные атрибуты, подобные кнопкам (то есть у них обоих объявлено собственное событие OnClick). Я имею в виду, по крайней мере, предоставить интерфейс или что-то подобное, например, IButton , которые оба TButton и TBitBtn реализуют.
Кажется, что эти типы, казалось бы, невинных изменений могут вызвать ненужный хаос. Это кажется странным, и мне интересно, знает ли кто-нибудь, почему CodeGear (или любой другой разработчик Framework) будет делать такие вещи?
Что еще более важно, учитывая это фрагментированное наследование, существует ли и элегантное решение для обработки TBitBtn как TButton ?