本文為 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 的要求。
沒有留言:
張貼留言