我有一个关于在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 ++中处理这个问题的最佳方法是什么。
谢谢!
答案 0 :(得分:2)
是的,只需制作两个独立的功能:
class B : public A {
void f() { return f(0); }
void f(int arg) { .... }
};
答案 1 :(得分:2)
当你有一个接口时,基本原则应该是一个函数ALWAYS采用相同的参数,并且ALWAYS以相同的方式运行,无论派生类正在做什么。不允许添加额外的参数,因为这假定对对象进行操作的“事物”“知道”参数是什么/做什么。
有几种解决这个问题的方法 - 立即想到的是:
第二个例子是:
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 ++中处理这个问题的最佳方法是什么。
听起来你需要编写一个脚本来自动化部分过程。