설명
클래스간의 호환성을 위해서 기존 클래스에 인터페이스를 덧씌우는 것.
예제 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | class TextView { public: TextView() : origin(-1, -1), extent(-1, -1), isEmpty(true) {} void GetOrigin(Coord& o) const { o = origin; } void GetExtent(Coord& e) const { e = extent; } virtual bool IsEmpty() const { return isEmpty; } protected: Coord origin; Coord extent; bool isEmpty; }; | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | class Shape { public: Shape() = default; virtual void BoundingBox(Point& bottomLeft, Point& topRight) const { bottomLeft = this->bottomLeft; topRight = this->topRight; } virtual class Manipulator* CreateManipulator() const {} protected: Point bottomLeft; Point topRight; }; | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | class TextShape_Class : public Shape, private TextView { public: TextShape_Class() = default; virtual void BoundingBox(Point& bottomLeft, Point& topRight) const { Coord origin, extent; GetOrigin(origin); GetExtent(extent); bottomLeft = Point(origin - (extent / 2)); topRight = Point(origin + (extent /2)); } virtual Manipulator* CreateManipulator() const { } virtual bool IsEmpty() const { return TextView::IsEmpty(); } }; | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | class TextShape_Object : public Shape { public : TextShape_Object(TextView* var) : _text(var) {}; virtual void BoundingBox(Point& bottomLeft, Point& topRight) const { Coord origin, extent; _text->GetOrigin(origin); _text->GetExtent(extent); bottomLeft = Point(origin - (extent / 2)); topRight = Point(origin + (extent / 2)); } virtual Manipulator* CreateManipulator() const { ; } virtual bool IsEmpty() const { return _text->IsEmpty(); } private: TextView* _text; }; | cs |
TextView 라는 클래스가 이미 구현되어 있는데,
Shape 이라는 내가 만든 인터페이스를 거기에 적용하고 싶음.
그래서 TextShape_Class 는 private 로 TextView 를 상속하고 Shape 를 public 으로 상속해서 이를 구현함.
반대로 TextShap_Object 는 TextView 를 멤버로 가지고 Shape 를 상속받아서 이를 구현함.
보통은 후자를 추천함.
추가 설명
모든 클래스에 다 적용가능함.
댓글 없음:
댓글 쓰기