Я недавно начал обновлять проект RAD Studio 2007 до RAD Studio 2009. Одна вещь, которую я заметил, - это когда, казалось бы, простой код внезапно не удалось скомпилировать.Что случилось с цепочкой наследования TBitBtn и TButton?
Пример кода:
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 цепочка наследования:
- TBitBtn: TButton
2009 цепочка наследования:
- TBitBtn: TCustomButton
- TButton: TCustomButton
В 2009 году, как TButton и TBitButton проистекают из TCustomButton, что было бы прекрасно, я полагаю, что если были проведены там кнопка, как атрибуты. Если бы это было так, я мог бы просто изменить код для работы с TCustomButton. К сожалению, TCustomButton не хранит такие вещи, как OnClick. Поэтому я больше не могу лечить TBitBtn, как TButton. Оба этих класса теперь имеют свои собственные отдельные кнопки, такие как атрибуты (т. Е. Оба имеют свое объявленное событие OnClick). Я имею в виду, по крайней мере, предоставить интерфейс или что-то вроде IButton что оба TButton и TBitBtn реализовать.
Кажется, что эти виды, казалось бы, невинных изменений - это те, которые могут нанести ненужный хаос. Это кажется странным, и мне интересно, знает ли кто-нибудь, почему CodeGear (или любой автор Framework в этом отношении) будет делать такие вещи?
Что еще более важно, учитывая это фрагментарное наследование, есть и элегантное решения для лечения TBitBtn как TButton?
Отличная информация! В чем разница между двумя последними примерами RTTI? –
Первый работает с указателями TObject и, таким образом, применяется ко всем типам объектов VCL независимо от их иерархии, тогда как второй работает только с TControl и потомками. –