实现/接口继承设计问题

时间:2010-04-21 18:56:35

标签: design-patterns inheritance interface

我想获得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_的地址。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我会说没有一种技术本身比其他技术更好 。它们在不同的场景中都很有用,具体取决于它们的使用环境。

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

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

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