我最近开始将我的 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继承链:
- TBitBtn : T按钮
2009继承链:
- TBitBtn : TCustomButton
- TButton : TCustomButton
在 2009 年,TButton和TBitButton都派生自TCustomButton,我想如果按钮之类的属性被保存在那里就可以了。如果是这种情况,我可以更改代码来处理TCustomButton。不幸的是,TCustomButton不包含OnClick之类的东西。因此,我不能再将TBitBtn视为TButton。这两个类现在都有自己独立的按钮类属性(即它们都声明了自己的 OnClick 事件)。我的意思是,至少提供一个接口或其他东西,比如TButton和TButton的IButtonTBitBtn实现。
似乎这些看似无辜的变化会造成不必要的破坏。这似乎很奇怪,我想知道是否有人知道为什么 CodeGear(或任何框架作者)会做这种事情?
更重要的是,考虑到这种碎片化的继承,是否有优雅的解决方案可以将TBitBtn视为TButton?