2023年6月5日 星期一

C++:簡介 External Polymorphism 模式

本文為 C++ Software Design 書的第 31 節內容。

External Polymorphism pattern 的目的是讓 non-polymorphic 的類別在不更改 API 的情況下仍然能有 polymorphism 的效果。 以下為一個畫出圓形與方形的例子:


// Non-polymorphic types
class Circle {
  explicit Circle(double radius) { /*...*/ }
};
class Square {
  explicit Square(double side) { /*...*/ }
};

// External polymorphism
class ShapeConcept {
  virtual ~ShapeConcept() = default;
  virtual void draw() const = 0;
};

template <typename Drawstrategy, typename ShapeT>
class ShapeModel : public ShapeConcept {
  explicit ShapeModel(ShapeT shape, DrawStrategy drawer) {
    /*...*/
  }
  void draw() const override;
};

Polymorphic 的部分被設計在 ShapeConcept 裡面而不是 Circle 或 Square 之中,也就是說 Circle 或 Square 與 draw 函數就沒有直接關係了。 

External polymorphism 與 Adapter pattern 有點類似,但可以從目的來分辨兩者:Adapter pattern 的目的是將已有的 API 稍作轉換至已存在的 interface;而 external polymorphism 是將已存在的型態加入 polymorphism 的關係。 External polymorphism 的缺點是會讓程式碼變得稍微複雜,並且不見得能滿足 value semantics 的要求。

沒有留言:

張貼留言