私は最近、RAD Studio 2007 プロジェクトを RAD Studio 2009 にアップグレードし始めました。私が気づいたことの 1 つは、一見単純なコードが突然コンパイルに失敗したことです。
コード例:
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年では失敗しています。TBitBtn
から派生するために使用される2007 年の継承チェーンを調べ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実装。
これらの一見無害な変更は、不必要な大混乱を引き起こす可能性があるようです。これは奇妙に思えますが、なぜ CodeGear (またはフレームワークの作成者) がこの種のことを行うのかを誰かが知っているかどうか疑問に思っていますか?
さらに重要なことは、この断片化された継承を考えると、 TBitBtnをTButtonのように扱う洗練された解決策はありますか?