簡體   English   中英

類兼容性的設計模式

[英]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或其他任何一種,它們都具有以下事實:它們具有xy坐標作為同一類型的成員變量。 如何使一段代碼與所有代碼兼容?

您只需要一個在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM