类兼容性的设计模式

时间:2017-11-09 15:18:13

标签: c++

我想知道解决以下问题的最有效率(关于速度)方法:

我们假设我们有一个班级AFoo,有一个简单的头文件:

AFoo.h

class AFoo {
public:
    double x;
    //Additional methods/variables belonging only to AFoo
};

现在,我收到了一组我没有定义的类(即其他一些顽固的程序员正在创建这些类),所有这些都是"分享" x变量。我们可以想象这样的集合中的一个成员是类BFoo,它看起来像:

BFoo.h

class BFoo {
public:
    double x;
    //Additional methods/variables belonging only to BFoo
};

现在,我在某个地方有一个接受指向AFoo

的指针的函数
void doSomething(AFoo *pnt){
    //does operations with the x member only.
}

我真的希望我的doSomething函数也接受指向BFoo或我给定的集合的任何类的指针。将x抽象为新的类Foo并不是解决办法,因为顽固的程序员拒绝继承它。我想过使用模板函数,但不方便的是每次顽固的程序员创建一个新类时我都要重新编译。

我的第一次尝试是定义一个行为如下的接口:

class AlternativeFoo {
public:
    virtual double & getX() = 0;
};

所以我可以定义另一个类,如

class AlternativeAFoo: public AlternativeFoo{
public:
    double & getX(){ return mPoint.x; };
private:
    APoint mPoint;
};

现在我可以更改doSomething方法以接受指向AlternativeFoo变量的指针,该指针工作正常。但是,此解决方案明显慢于模板类。我是否缺少一种不会影响性能的设计模式?非常感谢你!

编辑: 作为问题的一个具体例子,想象一下我编写一个我希望与同一抽象概念的几个定义兼容的库,例如,一个具有坐标x和y的2D点。这个定义可以来自视频游戏设计软件中的API或其他任何东西,并且它们都共享它们具有xy坐标作为相同类型的成员变量的事实。如何使一段代码与所有代码兼容?

1 个答案:

答案 0 :(得分:1)

您只需要一个在pnt->x(或其他)上运行的模板。

template <typename AnyFoo>
void doSomething(AnyFoo * pnt)
{
    pnt->x = 10;
}

如果您尝试doSomething("Something not a Foo e.g. a const char *")

,编译器会给您一条错误消息