2

私は、サイジングに関して多くの共通の動作を持つ一連のコントロールを開発しようとしています。これは多重継承が必要な例だと思います (反対のアドバイスは喜んで受け入れますが)。私がやりたいことは、基本的にミックスインパターンです

class Sizable {        
    ...
    public:
        ResizeMe();
        ResetText();
        ...
};

class sizeButton : public Sizable, public TButton {
...
};

class sizeEdit : public Sizable, public TEdit {
...
};

などなど…

私は Sizable クラスにかなりの量のサイジングコードを書き、それをテストしましたが、それは素晴らしいことでしたが、今では構造の残りの部分を設定しました (そうです、最初にクラスのスケルトンを書くべきだったでしょう)。悲しいことにそれを発見しました:

[BCC32 Error] szButton.h(15): E2278 Multiple base classes not supported for VCL classes

メンバー関数である必要のないすべての関数 (文字列の長さの測定など) を取り出しましたが、これができない関数がまだたくさんあります。

大量のコードを複製する必要がないように、設計に関するアドバイスはありますか?

4

2 に答える 2

3

Delphi(したがって、ほとんどがDelphiで記述されているVCL)は、クラスの多重継承をサポートしていません。ただし、v6以降では、VCLクラスが祖先として使用されている場合、インターフェイスの多重継承をサポートします。次に例を示します。

// must be a pure virtual class with no data members
// and no implementation of its own...
class Sizable
{
public:
    virtual void ResizeMe() = 0;
    virtual void ResetText() = 0;
    ...
};

class sizeButton : public TButton, public Sizable
{
public:
    virtual void ResizeMe();
    virtual void ResetText();
    ...
}; 

class sizeEdit : public TEdit, public Sizable
{
public:
    virtual void ResizeMe();
    virtual void ResetText();
    ...
}; 
于 2009-11-04T01:44:58.233 に答える
0

TButton継承するのではなく、メンバー (コンポジション)にしないのはなぜですか?

于 2009-10-30T01:01:48.507 に答える