C++ 如何扩展/组合包含纯虚拟函数的接口类?
我正在使用:C++ 如何扩展/组合包含纯虚拟函数的接口类?,c++,interface,multiple-inheritance,bada,pure-virtual,C++,Interface,Multiple Inheritance,Bada,Pure Virtual,我正在使用: class ISearchFuncs : public Osp::Ui::IActionEventListener , public Osp::Ui::ITextEventListener , public Osp::Ui::IScrollPanelEventListener { public: virtual result CloseOverlayKeyb() = 0; virtual result InitiateSearch() = 0
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)),, "");
很抱歉代码重复,但这让我抓狂
我试图遵循的习惯用法是。似乎Osp::Ui::IActionEventListener,
Osp::Ui::ITextEventListener,以及
Osp::Ui::IScrollPanelEventListener都派生自公共
基础您需要使用虚拟继承来避免公共基
上课
在被迫接受我在问题中概述的黑客攻击之后,由于使用存根IIRC重写方法,我遇到了一些错误
我90%确信这不是引发我问题的反常现象的原因,但100%确信它比pmr的答案更相关。您需要减少代码,使其比这更不可知框架,并解释什么不起作用。标准C++中没有连接事件。否则很难回答。@pmr:TryCatch是用来检测错误的。很抱歉,这不是标准的C++,因为没有正确的异常处理。在代码中比英文更好地表达,或者我想。我已经涉足了你所使用的任何框架的DOC,并向你展示了我将要做什么,但是这在框架方面不一定是正确的,只是在C++方面。其中的标识符保留在实现中,因此不允许使用它们。除此之外,尽量不要在C++中编写java,你会更快乐。@达蒙:除了MI,这里相当于java接口。这是一个好的观点,但是因为那些基类本身是纯抽象接口,没有具体的成员,所有纯虚拟的,没有不确定性的继承性的风险。已确认,无差异。
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;
};