如何设计类继承

How to design class inheritance

本文关键字:继承 设计类      更新时间:2023-10-16

我为其他人提供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;
    };