C++ 程式設計/類/抽象類/純抽象類
外觀
抽象類是指在其中聲明瞭成員函式但沒有定義成員函式的類。C++ 中表達這個概念的方式是將成員函式宣告分配為零。
- 示例
class PureAbstractClass
{
public:
virtual void AbstractMemberFunction() = 0;
};
純抽象類只有抽象成員函式,沒有資料或具體成員函式。通常,純抽象類用於定義介面,並且旨在被具體類繼承。它是一種強制執行類設計者和該類使用者之間契約的方式。此類的使用者必須為該類編譯宣告匹配的成員函式。
- 純抽象類的使用示例
class DrawableObject
{
public:
virtual void Draw(GraphicalDrawingBoard&) const = 0; //draw to GraphicalDrawingBoard
};
class Triangle : public DrawableObject
{
public:
void Draw(GraphicalDrawingBoard&) const; //draw a triangle
};
class Rectangle : public DrawableObject
{
public:
void Draw(GraphicalDrawingBoard&) const; //draw a rectangle
};
class Circle : public DrawableObject
{
public:
void Draw(GraphicalDrawingBoard&) const; //draw a circle
};
typedef std::list<DrawableObject*> DrawableList;
DrawableList drawableList;
GraphicalDrawingBoard drawingBoard;
drawableList.pushback(new Triangle());
drawableList.pushback(new Rectangle());
drawableList.pushback(new Circle());
for(DrawableList::const_iterator iter = drawableList.begin(),
endIter = drawableList.end();
iter != endIter;
++iter)
{
DrawableObject *object = *iter;
object->Draw(drawingBoard);
}
請注意,這是一個有點人為的例子,可繪製物件沒有完全定義(沒有建構函式或資料),但它應該能讓您對定義介面的強大功能有一個大致瞭解。一旦物件被構造,呼叫介面的程式碼不知道被呼叫物件的任何實現細節,只知道介面本身。物件 GraphicalDrawingBoard 是一個佔位符,代表將要繪製物件的載體,例如影片記憶體、繪圖緩衝區、印表機。
請注意,在純抽象基類中新增具體成員函式和資料,存在很大的誘惑。這必須被抵制,通常這是介面沒有很好地分解的標誌。資料和具體成員函式往往意味著特定的實現,因此可以從介面繼承,但不能是該介面。相反,如果具體類之間存在一些共同點,那麼建立一個從純抽象類繼承其介面並定義具體類的共同資料和成員函式的抽象類效果很好。應該仔細考慮是否應該使用繼承或聚合。過多的繼承層級會使類的維護和使用變得困難。通常,繼承的接受層級最大約為 3 層,超過此層級,通常需要對類進行重構。一個通用的測試是“是”與“有”,例如正方形是一種矩形,但正方形有一組邊。