跳轉到內容

更多 C++ 習語/介面類

來自華夏公益教科書,開放的書,開放的世界

介面類

[編輯 | 編輯原始碼]
  • 將類的介面與其實現分離。
  • 使用執行時多型呼叫抽象/類的實現。

也稱為

[編輯 | 編輯原始碼]

將類的介面與其實現分離是高質量面向物件軟體設計/程式設計的基礎。對於面向物件程式設計,分離的主要機制是介面類。然而,C++(與 Java 相比)沒有提供專門的機制來表達這種分離。在 Java 中,interface 關鍵字用於指定抽象支援的公共方法。C++ 沒有這樣的關鍵字,但可以使用介面類習語來近似表達其功能。這個想法是隻表達抽象的公共方法,並且不提供任何方法的實現。此外,缺乏實現意味著不允許建立介面類的例項。

解決方案和示例程式碼

[編輯 | 編輯原始碼]

介面類只包含一個虛解構函式和純虛擬函式,從而提供了類似於其他語言(如 Java)的介面構造。介面類是指定多型介面(即純虛擬函式宣告)到基類的類。使用類層次結構的程式設計師可以透過一個基類來進行操作,該基類只與層次結構中的類的介面進行通訊。

class shape   // An interface class
{
  public:
    virtual ~shape() {};
    virtual void move_x(int x) = 0;
    virtual void move_y(int y) = 0;
    virtual void draw() = 0;
//...
};

class line : public shape
{
  public:
    virtual ~line();
    virtual void move_x(int x); // implements move_x
    virtual void move_y(int y); // implements move_y
    virtual void draw(); // implements draw
  private:
    point end_point_1, end_point_2;
//...
};

int main (void)
{
  std::vector<shape *> shapes;
  //  Fill up shapes vector somehow.
  for (std::vector<shape *>::iterator iter (shapes.begin());
       iter != shapes.end();
       ++iter)
  {
    (*iter)->draw();
  }
  //  Clean up shapes vector. (Normally we would use something like std::unique_ptr to automate cleanup,
  //  this is for illustration only)
}

每個介面類都應該有一個虛解構函式。虛解構函式確保當以多型方式刪除形狀時,呼叫派生類的正確解構函式。否則,很有可能發生資源洩漏。使用介面類表達設計有很多好處。

  • 可以新增新的形狀抽象,而無需更改只依賴形狀介面的程式碼。例如,Square 可以繼承自 shape,並在其自己的方式中實現介面方法。main() 函式根本不需要更改。
  • 將介面與實現分離可以防止重新編譯只依賴介面類的程式部分。
  • 依賴倒置原則 (DIP) 指出實現類不應該相互依賴。相反,它們應該依賴於使用介面類表示的共同抽象。DIP 減少了面向物件系統中的耦合。

已知用途

[編輯 | 編輯原始碼]

幾乎所有用 C++ 編寫的良好面向物件軟體!

[編輯 | 編輯原始碼]

參考文獻

[編輯 | 編輯原始碼]

C++ 介面類 - 簡介

華夏公益教科書