我正在寻找一种实现接口实现子集之间通用代码的最佳方法。具体地说,假设我们有一个由A,B和C实现的接口P.再次,假设A和B具有某些共同的功能(公共代码),B和C具有某些共同的功能,类似的A和C具有共同的功能在执行界面。我理解:
1应该是理论上最优的解决方案,然而,实际上它可能会产生巨大的混乱,因为实际上我不只是有3个类实现接口而是大量的接口。此外,共同的功能不仅在对之间,而且在类的大子集之间,并且存在许多这样的子集。因此,我们需要有大量的中间类来实现不同子集之间的通用功能。这使得通过中间类实现变得困难/低效,因为我们需要大量的这些中间类。
我认为2也不是最好的解决方案,因为它需要代码复制,这会导致代码维护问题。
编辑:我试图简化问题,以便在回复评论时提供清晰的图片。
答案 0 :(得分:0)
您可以在模板函数中定义常用实现,并根据需要从每个类调用它们来实现接口函数。
使用您的界面P,A,B和C类,它提供以下内容。
struct P {
virtual int X() = 0;
};
template <typename T>
int CommonAB( T const & t ) { return t.x; }
template <typename T>
int CommonBC( T const & t ) { return t.y; }
template <typename T>
int CommonCA( T const & t ) { return t.x+t.y; }
struct A : public P {
int X() { return CommonAB( *this )+CommonCA( *this ); }
protected:
int x;
int y;
friend int CommonAB<A>( A const & );
friend int CommonCA<A>( A const & );
};
struct B : public P {
int X() { return CommonBC( *this )+CommonAB( *this ); }
protected:
short x;
short y;
friend int CommonBC<B>( B const & );
friend int CommonAB<B>( B const & );
};
struct C : public P {
int X() { return CommonCA( *this )+CommonBC( *this ); }
protected:
char x;
char y;
friend int CommonCA<C>( C const & );
friend int CommonBC<C>( C const & );
};
int main()
{
A a;
B b;
C c;
a.X();
b.X();
c.X();
return 0;
}