如何在不更改代码的情况下替换接口的实现?

时间:2016-03-30 20:43:29

标签: c++ interface

假设我写了这样的代码:

// 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:(

顺便说一下这个例子非常简单,但在我的实际代码中,代码中只有一行,我在那里创建实例。

1 个答案:

答案 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;
}