Как я могу расширить / объединить классы интерфейса, содержащие чисто виртуальные функции? - PullRequest
0 голосов
/ 06 марта 2012

Я использую:

class ISearchFuncs :
    public Osp::Ui::IActionEventListener
    , public Osp::Ui::ITextEventListener
    , public Osp::Ui::IScrollPanelEventListener {
public:
    virtual result CloseOverlayKeyb() = 0;
    virtual result InitiateSearch() = 0;
};

но когда я пытаюсь подключиться к этим интерфейсам, передав указатель на ISearchFuncs, обратный вызов / события не запускаются. Принимая во внимание, что подключение с использованием этих интерфейсов в классе, который фактически их реализует, не имеет таких проблем. Я мог бы жить с этим, но было бы лучше инкапсуляции, если бы я мог добраться до сути этой проблемы.

class Form1 :
    public Osp::Ui::Controls::Form
    , public ISearchFuncs
//  , public Osp::Ui::IActionEventListener// see below
//  , Osp::Ui::ITextEventListener//deleted due to ambiguity
    {

Вот как это можно заставить работать:

    EditField *pSearchEditField = new EditField;
    TryCatch(E_SUCCESS == (r = pSearchEditField->Construct(Rectangle(labelRect.x + labelRect.width / 6, labelRect.y, 7 * labelRect.width / 12, 80)
                        , EDIT_FIELD_STYLE_NORMAL, INPUT_STYLE_OVERLAY, false, 100, GROUP_STYLE_MIDDLE)),, GetErrorMessage(r));
    pSearchEditField->AddTextEventListener(*this);
    pSearchEditField->AddScrollPanelEventListener(*this);
    pSearchEditField->AddActionEventListener(*this);
    TryCatch(E_SUCCESS == (r = pSearchEditField->SetOverlayKeypadCommandButton(COMMAND_BUTTON_POSITION_LEFT,
            L"Done", SearchPanel::ID_BUTTON_SEARCH_EDITFIELD_DONE)),, "");
    TryCatch(E_SUCCESS == (r = pSearchEditField->SetOverlayKeypadCommandButton(COMMAND_BUTTON_POSITION_RIGHT,
            L"Cancel", SearchPanel::ID_BUTTON_SEARCH_EDITFIELD_CANCEL)),, "");
    __pScrollPanel->AddControl(*pSearchEditField);

, тогда как при передаче другому классу для выполнения эквивалентного события не удается подключить события во время выполнения:

    __pSearchPanel->Construct(labelRect, this, __pScrollPanel);

звонки:

result SearchPanel::Construct(const Rectangle &rect, ISearchFuncs *pListener, ScrollPanel *pScrollPare) {
    result r = E_SUCCESS;
    int x1 = rect.width / 6;
    int x2 = rect.width * 3 / 4;
    int y1 = rect.height / 3;

    EditField *pSearchEditField = new EditField;
    TryCatch(E_SUCCESS == (r = pSearchEditField->Construct(Rectangle(rect.x + x1, rect.y, x2 - x1, y1)
            , EDIT_FIELD_STYLE_NORMAL, INPUT_STYLE_OVERLAY, false, 100, GROUP_STYLE_MIDDLE)),, GetErrorMessage(r));
    pSearchEditField->AddTextEventListener(*pListener);
    pSearchEditField->AddScrollPanelEventListener(*pListener);
    pSearchEditField->AddActionEventListener(*pListener);
    TryCatch(E_SUCCESS == (r = pSearchEditField->SetOverlayKeypadCommandButton(COMMAND_BUTTON_POSITION_LEFT,
            L"Done", SearchPanel::ID_BUTTON_SEARCH_EDITFIELD_DONE)),, "");
    TryCatch(E_SUCCESS == (r = pSearchEditField->SetOverlayKeypadCommandButton(COMMAND_BUTTON_POSITION_RIGHT,
            L"Cancel", SearchPanel::ID_BUTTON_SEARCH_EDITFIELD_CANCEL)),, "");
    TryCatch(E_SUCCESS == (r = pScrollPare->AddControl(*pSearchEditField)),, "");

Извините за дублирование кода, но это сводит меня с ума.

Идиома, которой я пытаюсь следовать, является частью помощи bada SDK .

Ответы [ 2 ]

0 голосов
/ 19 марта 2012

После того, как меня заставили принять хак, который я изложил в своем вопросе, я получил некоторые ошибки из-за переопределения методов с заглушками, IIRC.

Я на 90% уверен, что это не было причиной аномалииэто вдохновило меня на мой вопрос, но на 100% уверен, что это более актуально, чем ответ pmr.

0 голосов
/ 06 марта 2012

Кажется, что Osp::Ui::IActionEventListener, Osp::Ui::ITextEventListener и Osp::Ui::IScrollPanelEventListener все происходят из общей базы.Вам нужно использовать virtual наследование, чтобы избежать общих базовых классов.

class ISearchFuncs :
    public virtual Osp::Ui::IActionEventListener
    , public virtual Osp::Ui::ITextEventListener
    , public virtual Osp::Ui::IScrollPanelEventListener 
{
public:
  virtual result CloseOverlayKeyb() = 0;
  virtual result InitiateSearch() = 0;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...