Множественное наследование VCL - PullRequest
2 голосов
/ 30 октября 2009

Я пытаюсь разработать набор элементов управления, которые имеют ряд общих поведений в отношении размеров. Я думаю, что это тот случай, когда требуется множественное наследование (хотя я полностью готов принять любой совет об обратном). То, что я хотел бы сделать, это в основном миксиновый паттерн

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

Я вытащил все функции, которые не обязательно должны быть функциями-членами (например, измерение длины строк), но есть еще много функций, где это невозможно.

У кого-нибудь есть советы по проектированию, чтобы мне не пришлось дублировать тонну кода?

Ответы [ 2 ]

3 голосов
/ 04 ноября 2009

Delphi (и, следовательно, VCL, который в основном написан на Delphi) не поддерживает множественное наследование классов. Однако, начиная с 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();
    ...
}; 
0 голосов
/ 30 октября 2009

Почему бы не сделать TButton членом (составом), а не наследовать от него?

...