接口实现与其他默认参数?

时间:2013-09-07 16:22:33

标签: c++ oop

我有一个关于在C ++中实现接口的问题:

假设有一个界面:

class A
{
 virtual void f() = 0;
};

在实现这一点时,我想知道是否有办法做某事:

class B : public A {     
  void f(int arg=0) {....} // unfortunately it does not implement f() this way
};

我想保持iterface干净。当客户端代码通过公共接口A调用时,arg始终自动设置为0。但是当我通过B调用它时,我可以灵活地调用它,并将arg设置为某个不同的值。它可以实现吗?

编辑:由于我控制了界面和实现,我对任何建议,宏,模板,仿函数或其他任何有意义的东西持开放态度。我只想拥有一个简洁的代码库。这堂课很大,我不想写任何非绝对必要的代码 - 例如另一个简单地转发到实际实现的函数。

EDIT2:只想澄清一下:公共接口是提供给客户端的。它比B类接口更具限制性,B类接口仅在内部使用。然而,除了基于输入arg的次要不同处理之外,函数f()基本上做同样的事情。真正的类有很多接口函数,签名很复杂。快速执行函数转发导致繁琐的代码重复,并且它污染了B的内部接口。我想知道在C ++中处理这个问题的最佳方法是什么。

谢谢!

4 个答案:

答案 0 :(得分:2)

是的,只需制作两个独立的功能:

class B : public A {     
    void f() { return f(0); }
    void f(int arg) { .... }
};

答案 1 :(得分:2)

当你有一个接口时,基本原则应该是一个函数ALWAYS采用相同的参数,并且ALWAYS以相同的方式运行,无论派生类正在做什么。不允许添加额外的参数,因为这假定对对象进行操作的“事物”“知道”参数是什么/做什么。

有几种解决这个问题的方法 - 立即想到的是:

  1. 将参数添加到interface / baseclass。
  2. 不要使用参数,而是[在创建派生对象时或其他“知道差异”的地方]的一些额外函数将额外信息存储在需要它的对象中。
  3. 添加另一个“知道”类中的参数的类。
  4. 第二个例子是:

    class B: public A
    {  
       private:
         int x; 
       public:
         B() x(0) { ... }   // default is 0. 
         void f() { ... uses x ... }
         void setX(int newX) { x = newX; };
         int getX() { return x; }
    };
    

    因此,当您想要将x与另一个值用于零时,您可以调用bobject->setX(42);或类似的东西。

答案 2 :(得分:0)

根据您的描述,我会说您应该提供两个类,这两个类都有一个特定的职责:一个用于实现所需的功能,另一个用于为客户端提供所需的接口。这样你就可以分开关注并且不违反SRP:

class BImpl {
public:
  doF(int arg);  
};

class B : public A {
  BImpl impl;
public:
  virtual void f() override {
    impl.doF(0);
  }
};

答案 3 :(得分:0)

  

快速执行函数转换会导致繁琐的代码重复,并且会污染B的内部接口。我想知道在C ++中处理这个问题的最佳方法是什么。

听起来你需要编写一个脚本来自动化部分过程。