[英]Which is the design pattern for easy maintanace of backward compatibility of data files?
[英]Design pattern for class compatibility
我想知道哪種方法是解決以下問題的最有效的方法 (關於速度):
假設我們有一個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
是沒有解決方案的,因為programmer強的程序員拒絕繼承它。 我曾想過使用模板函數,但不便的是,每次頑固的程序員創建新類時,我都必須重新編譯。
我的第一個嘗試是定義一個行為如下的接口:
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或其他任何一種,它們都具有以下事實:它們具有x
和y
坐標作為同一類型的成員變量。 如何使一段代碼與所有代碼兼容?
您只需要一個在pnt->x
(或其他任何值)上運行的模板。
即
template <typename AnyFoo>
void doSomething(AnyFoo * pnt)
{
pnt->x = 10;
}
如果您嘗試執行doSomething("Something not a Foo eg a const char *")
則您的編譯器會給您一條錯誤消息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.