2016-06-09 119 views
0

如果我有兩個行爲相似但返回值不同的類,那麼實現它的最佳方法是什麼?如何實現具有類似行爲的兩個類

例如:

class A{ 
    int method1(int a, int b){ ... do something...} 
} 
class B{ 
    float method1(int a, int b){ ... do the same stuff as in class A...} 
} 

,我能想到的是落實在第三C類的所有顯著代碼,繼承它,並編寫相應的類A包裝和B的唯一的事他們返回的值。

有沒有更好的方法來做到這一點?

+4

一個自由函數函數模板? – Niall

+0

這將是很難給出的建議,這是真正的一般,而不是具體到這個例子。如果您打算將其用於多種用途,最好給這些內容多一些背景以獲得適用於所有這些解決方案的解決方案。 – chris

+0

「第三類C中的所有重要代碼並從中繼承」也稱爲[mixin](https://en.wikipedia.org/wiki/Mixin) – dhke

回答

0

另一種方法是使用CRTP成語是可能的:

template<typename T> 
struct C { 
    auto method1(int a, int b){ 
     return static_cast<T*>(this)->method1Impl(a, b); 
    } 
}; 

struct A: C<A> { 
    int method1Impl(int a, int b) { return 42; } 
}; 

struct B: C<B> { 
    float method1Impl(int a, int b) { return .0; } 
}; 

int main() { 
    A a; 
    B b; 

    a.method1(0, 0); 
    b.method1(0, 0); 
} 

請注意,此解決方案有效,如果你可以使用C++ 14。

+0

謝謝,這將是一個很好的解決方案,但不幸的是我只能使用C++ 11。 – gravicapa

0

我會做到這一點通過使B A的孩子,(繼承),這將如下所示(假設我們做的除了展示):

class A { 
public: 
    int method1(int a, int b) { 
     return a + b; // your implementation here 
    } 
}; 

注意方法1在A必須公開或受保護(非私人),以便B,孩子可以訪問它。

class B : A // Declare that B extends A 
{ 
public: 
    float method1(int a, int b){ 
     return A::method1(a, b); // access method1 from A 
    }; 
}; 

現在,您可以在A和B中使用相同的方法,並使用不同的返回類型。

0

有什麼理由不:

namespace 
{ 
    commonFunc(int a, int b) { do common stuff} 
} 

class A{ 
    int method1(int a, int b){ commonFunc(a,b);} 
} 
class B{ 
    float method1(int a, int b){ commonFunc(a,b);} 
} 

這需要更多的工作,如果常用的功能直接操縱成員變量,但似乎最簡單的解決方案。

相關問題