【问题标题】:C++ Interface, What's the best way to not duplicate codeC ++接口,不重复代码的最佳方法是什么
【发布时间】:2022-01-19 09:45:42
【问题描述】:

我有这个问题:

我有一个调用事件函数 do() 的事件管理器

Event *p; 
//p takes it values from an Event Queue
p->do()

一些事件有两个属性对象a和b

class EventX : public Event {

   public : 
       EventX();
       void do(){actionX(a, b)}
   private : 
       Object a;
       Object b;
       bool bothSide;

};

class EventY : public Event {

   public : 
       EventY();
       void do(){actionY(a,b);}
   private : 
       Object a;
       Object b;
       bool bothSide;

};

do() 是一个执行从 a 到 b 的动作的函数。 如果bothSide属性为真,我想创建一个可以从a调用do()到b和从b到a的do()的接口。 那可能吗 ?我有许多具有不同 do() 函数的事件,它们执行从 a 到 b 的不同操作。

感谢您的阅读

【问题讨论】:

  • 如果doEvent 中的一个虚方法,那么派生类可以实现它来做任何他们喜欢的事情。问题不清楚。你能展示你想写但不知道怎么写的代码吗?或者显示您希望避免重复的代码。
  • 我显然想做 make do(){ if(bothSide) actionX(b, a) actionX(a, b) }
  • 您可以根据一些配置参数(这里它是一个布尔值)编写一个模板类,然后简单地使用constexpr 布尔值来确定要执行的操作。或者,参数是类调用的某个函数/lambda。
  • 由于你没有指定“更好”的标准,所以无法说什么是最好的——最多这样的描述是基于意见的,不同的人有不同的意见。一个选项是放置成员abbothSide,并在EventXEventY的公共基类中声明一个虚函数do() .该公共基础可能是Event 或派生自Event 的另一个中间类。

标签: c++ pointers inheritance interface architecture


【解决方案1】:

你可以有额外的层与另一个接口

struct EventAB : Event
{
    void do() final { if (bothSide) action(b, a); action(a, b); }
    virtual void action(Object&, Object&) = 0;

/*...*/

private:
    Object a;
    Object b;
    bool bothSide = false;
};

然后

class EventX : public EventAB {
public:
    void action(Object& lhs, Object& rhs) override { actionX(lhs, rhs); }
    // ...
};

class EventY : public EventAB {
public:
    void action(Object& lhs, Object& rhs) override { actionY(lhs, rhs); }
    // ...
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-30
    • 1970-01-01
    • 1970-01-01
    • 2016-05-05
    • 1970-01-01
    • 1970-01-01
    • 2010-11-21
    • 1970-01-01
    相关资源
    最近更新 更多