我为其他人提供3个接口类IA,IB,IC。然后我需要实现这 3 个接口类。我的实现方法如下,但是 a(( 在 3 个类中的行为是一样的,我该如何复用代码。
class IA{
virtual void a() = 0;
};
class IB : public IA{
virtual void b() = 0;
};
class IC: public IA{
virtual void c() = 0;
};
class A :public IA{
void a(){}
};
class B :public IB{
void a(){}
void b(){}
};
class C :public IC{
void a(){}
void c(){}
};
有几种方法:
-
创建通用函数:
void f() { /*..*/ } class A : public IA{ void a() override { f(); } }; class B : public IB{ void a() override { f(); } void b() override { /**/ } }; class C : public IC{ void a() override { f(); } void c() override { /**/ } };
-
使用虚拟继承
class IB : public virtual IA{ virtual void b() = 0; }; class IC : public virtual IA{ virtual void c() = 0; }; class A : public virtual IA{ void a() override { /*..*/ } }; class B : public A, public IB{ void b() override { /**/ } }; class C : public A, public IC{ void c() override { /**/ } };
-
使用模板/CRTP
template </*typename Derived,*/ typename Base> struct AImpl : public Base { void a() override { /*..*/ } }; class A : public AImpl</*A,*/ IA> { }; class B : public AImpl</*B,*/ IB> { void b() override { /**/ } }; class C : public AImpl</*C,*/ IC> { void c() override { /**/ } };
-
使用合成
class A : public IA{ void a() override { /**/ } }; class B : public IB{ void a() override { mA.a(); } void b() override { /**/ } private: A a; }; class C : public IC{ void a() override { mA.a(); } void c() override { /**/ } private: A a; };