类兼容性的设计模式

  • 本文关键字:设计模式 兼容性 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坐标作为同一类型的成员变量。如何使一段代码与所有代码兼容?

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

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

如果您尝试doSomething("Something not a Foo e.g. a const char *"),编译器会给您一条错误消息

最新更新