另一種選擇是創建一個Movable
接口(純虛類)聲明用於移動方法移動實現,並從中獲得實現的子類這些方法:
Block Movable
| |
+-ColorBlock----------+-MovableColorBlock
| |
+-ImageBlock----------+-MovableImageBlock
編輯
呀,如果move()
方法真的是子類之間是相同的,那麼這是不是你想要的。
聽起來好像move()
操作對於draw()
操作是正交的,這對我來說建議是聚合而不是子類。所以讓我們稍微左轉一下。
A Block
有一個位置;也許是位置參數可能是有什麼活動或不:
class Position
{
public:
Position(int x, int y) : m_x(x), m_y(y) { }
virtual ~Position() {}
int getX() const { return m_x; }
int getY() const { return m_y; }
virtual bool movable() const { return false; }
protected:
int m_x;
int m_y;
};
class MovablePosition : public Position
{
public:
MovablePosition(int x, int y) : Position(x, y) {}
virtual ~MovablePosition() {}
void move(int newX, int newY) { m_x = newX; m_y = newY; }
virtual bool movable() const { return true; }
};
那麼你的基地Block
類需要一個Position
作爲參數:
class Block
{
public:
Block(Position *p) : m_pos(p) {}
virtual ~Block() {}
virtual void draw() = 0;
Position *getPos() const { return m_pos; }
protected:
Position *m_pos;
};
然後,如果你想移動Block
子類的實例,你」 ð首先檢查movable()
方法:
if (myColorBlock.getPos()->movable())
{
MovablePosition *p = myColorBlock.getPos();
p->move(newX, newY);
myColorBlock.draw();
}
無需創建冗餘MovableXxxBlock
類,不重複代碼。在這種方案下,塊的可移動性是在運行時建立的,而不是編譯時間;這可能會或可能不符合您的目標。
不是我正在尋找的東西,但tbh這是目前爲止唯一的理智答案:P –