2016-06-09 79 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);} 
} 

这需要更多的工作,如果常用的功能直接操纵成员变量,但似乎最简单的解决方案。

相关问题