继承

尽量使用组合而不是继承。如果使用继承,只用public继承。 允许接口继承,尽量不使用实现继承。

  • 优先使用组合:尽量通过组合来复用代码,因为它提供了更大的灵活性,并且减少了类之间的耦合。
  • 使用继承时:如果使用继承,应仅使用public继承,避免使用protected或private继承。
  • 接口继承:允许接口继承,但尽量不使用实现继承,以保持接口的清晰和简洁。

以下是一个不推荐的继承和组合的使用示例:

不推荐示例

class Base {
public:
    void baseFunction() { /* 实现 */ }
};

class Derived : private Base { // 私有继承
public:
    void derivedFunction() { /* 实现 */ }
};

class AnotherClass {
    void function() {
        Derived d;
        d.baseFunction(); // 无法访问私有继承的基类成员
    }
};
  • 私有继承限制了基类的接口,使得派生类之外的代码无法直接使用基类的功能。
  • 这种继承方式可能导致代码的脆弱性和低可维护性。

推荐示例

class Interface {
public:
    virtual void interfaceFunction() = 0;
};

class Implementor : public Interface {
public:
    void interfaceFunction() override { /* 实现 */ }
    void additionalFunction() { /* 实现 */ }
};

class Client {
private:
    Implementor implementorInstance; // 组合
public:
    void clientFunction() {
        implementorInstance.interfaceFunction();
    }
};
  • 使用组合可以在不同的上下文中灵活地使用Implementor的功能。
  • public继承保持了接口的透明性,并且遵循了面向对象设计的原则。
  • 接口继承定义了清晰的契约,避免了实现细节的污染。