【问题标题】:Implementation/interface inheritance design question实现/接口继承设计问题
【发布时间】:2010-04-21 18:56:35
【问题描述】:

我想了解 stackoverflow 社区对以下三种设计模式的看法。首先是实现继承;二是接口继承;三是中间立场。我的具体问题是:哪个最好?

实现继承:

class Base {
  X x() const = 0;
  void UpdateX(A a) { y_ = g(a); }
  Y y_;
}

class Derived: Base {
  X x() const { return f(y_); }
}

接口继承:

class Base {
  X x() const = 0;
  void UpdateX(A a) = 0;
}

class Derived: Base {
  X x() const { return x_; }
  void UpdateX(A a) { x_ = f(g(a)); }
  X x_;
}

中间地带:

class Base {
  X x() const { return x_; }
  void UpdateX(A a) = 0;
  X x_;
}

class Derived: Base {
  void UpdateX(A a) { x_ = f(g(a)); }
}

我知道很多人更喜欢接口继承而不是实现继承。不过后者的好处是有了指向Base的指针,x()可以内联,x_的地址可以静态计算。

【问题讨论】:

    标签: design-patterns inheritance interface


    【解决方案1】:

    我会说没有一种技术天生就比其他技术更好。根据使用的上下文,它们在不同的场景中都有用。

    如果您正在实现Composite Pattern 并且大多数类将使用相同的实现,那么实现继承可能是要走的路。它将允许您为需要它的类改进实现,同时为不需要它的类共享代码。

    如果您正在实现Visitor Pattern,其中每个类的方法实现可能完全不同,那么接口继承可能最有意义。在这种情况下,基类实现可能只会被单个类使用。

    如果您要继承一个不是使用面向对象技术设计的项目,我可以看到您的中间立场示例很有用。也许您需要在添加新功能时对其进行重构,并且可以将其用作使遗留代码与使用面向对象设计的新代码交互的一种方式。这比实际的“最佳实践”更像是一种妥协,但我们都必须让它们运送产品......如果我能想到一个更好/更具体的例子,我会发布它。

    【讨论】:

      【解决方案2】:

      如果有多个派生类都在输入上使用g(a) 转换,那么我会选择第一个选项,以避免重复代码。我认为这是比优化元素寻址更高的目标。

      【讨论】:

        猜你喜欢
        • 2021-10-21
        • 1970-01-01
        • 2021-06-24
        • 1970-01-01
        • 1970-01-01
        • 2011-04-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多