【发布时间】:2014-06-12 16:54:41
【问题描述】:
我最近开始将我的 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 : TButton
2009继承链:
- TBitBtn : TCustomButton
- TButton : TCustomButton
在 2009 年,TButton 和 TBitButton 都派生自 TCustomButton,我想如果按钮类属性保留在那里就可以了。如果是这种情况,我可以更改代码来处理 TCustomButton。不幸的是,TCustomButton 不包含 OnClick 之类的东西。因此,我不能再将 TBitBtn 视为 TButton。这两个类现在都有自己独立的按钮之类的属性(即它们都声明了自己的 OnClick 事件)。我的意思是,至少提供一个接口或其他东西,例如 TButton 和 TBitBtn 都实现的 IButton。
似乎这些看似无害的变化会造成不必要的破坏。这看起来很奇怪,我想知道是否有人知道为什么 CodeGear(或任何框架作者)会做这种事情?
更重要的是,考虑到这种分散的继承,是否有优雅的解决方案可以将 TBitBtn 视为 TButton?
【问题讨论】:
标签: c++ c++builder vcl c++builder-2009