假设我写了这样的代码:
// myinterface.h
struct MyInterface { void foo()=0; };
// mydefault.h
#include "myinterface.h"
struct MyDefaultImplementation : MyInterface { void foo(){} };
// main.cpp
#include "myinterface.h"
#include "mydefault.h" // (X)
int main(){
MyInterface* x = new MyDefaultImplementation(); // (X)
x->foo();
}
我可以轻松地提供不同的界面实现,但我需要更改我创建实例的行,当然还有include(X)。
是否可以在不更改现有代码的情况下替换接口的实现?
只是为了澄清:当然使用上面的代码是不可能的,但是我可以以某种方式更改它,以便稍后当我想切换到接口的另一个实现时我不必更改它吗?
我能找到的最近的是this,但那就是java:(
顺便说一下这个例子非常简单,但在我的实际代码中,代码中只有一行,我在那里创建实例。
答案 0 :(得分:3)
使用工厂方法,例如:
myinterface.h
struct MyInterface
{
virtual ~MyInterface() {}
virtual void foo() = 0;
};
MyInterface* createMyInterface();
的main.cpp
#include "myinterface.h"
int main()
{
MyInterface* x = createMyInterface();
x->foo();
delete x;
}
然后你可以让createMyInterface()
创建你需要的任何结构类型,例如:
mydefault.h
#include "myinterface.h"
struct MyDefaultImplementation : MyInterface
{
void foo(){}
};
myinterface.cpp
#include "mydefault.h"
MyInterface* createMyInterface()
{
return new MyDefaultImplementation;
}