攝影師:Caio: https://www.pexels.com/zh-tw/photo/46274/

[基礎概念] 簡單說說物件導向三大特性:封裝、繼承和多型

談到物件導向會提到三大基本概念:繼承(Inheritance)、封裝(Encapsulation)、多型(Polymorphism)。

本篇就稍微紀錄一下簡單的解釋,未來會依理解程度慢慢增加……

繼承(Inheritance)

繼承的概念就如同字面意思。如果拿很經典的動物例子舉例的話,每個動物幾乎都需要吃和睡覺,因此我們可以宣告一個類別叫做 Animal,狗這個動物是除了吃和睡覺以外還會吠叫,因此繼承 Animal 之外,還多了 bark 方法。Dog 既繼承了 Animaleat()sleep(),也有自己特有的 bark()

class Animal{
  eat();
  sleep();
}

class Dog: public Animal{
  bark();
}

另外還有一個比較容易理解的例子是計算形狀的面積。先宣告一個類別叫做 Shape,基本屬性想設定長和寬,Shape 裡面我宣告了 widthheight 變數。

class Shape {
  protected:
    int width;
    int height;

  public:
    void setWidth(int w) {
      width = w;
    }
    void setHeight(int h) {
      height = h;
    }
};

並且由 Rectangle 繼承類別,並計算它的面積。

class Ractangle: public Shape {
  public:
    int Area(){
      return width * height;
    }
};

這樣我製作一個 Rectangle 物件,就可以設定長寬並計算面積:

int main(void) {
   Ractangle rec1;
 
   rec1.setWidth(5);
   rec1.setHeight(7);

   cout << "Area: " << rec1.Area() << endl;
 
   return 0;
}

封裝(Encapsulation)

將資料和函數放在同一種結構中,這種結構我們稱為物件。白話一點就是整包拿去用啦,不需要知道裡面是什麼,讓我們在使用上很方便。

封裝的概念下我們可以對程式碼設置權限,讓不同的物件有不同的存取限制,提高安全性。要達到這個目的,需要靠存取控制修飾子:publicprivate 以及 protected

簡單來說就是要防止或保護資料被我們無意中破壞。

public

被宣告為 public 的成員變數或是函式,可以讓同一類別的成員存取,也可以讓別的類別或物件的成員存取。也就是說不設定任何權限,即使其他類別或是套件,都可以使用。

private

被宣告為 private 的成員變數或是函式,只能讓同一類別的成員存取,禁止讓其他類別或物件的成員存取。

不過了解後一定會有一個疑問:若只能在同一類別的成員使用,會失去物件導向最重要的精神吧。所以有一種方式,是將變數宣告為 private,再宣告一個 public 方法讓其他類別或物件的成員存取。
舉例來說我現在宣告了一個物件叫做「咖啡」,他的「咖啡豆種類」宣告為 private,再宣告一個 public 方法 make() 執行製作咖啡這個動作,並在裡面使用咖啡豆種類以及執行一些其他的製作方法。這樣的話當我們呼叫 make() 時,既可以使用到咖啡豆種類這個屬性去計算,也能夠確保咖啡豆種類不會被任意竄改。

protected

權限有點介於上方兩者之間。被宣告為 protected 的成員變數或是函式,只能讓同一個類別或是物件的成員,以及繼承於它的子物件存取,除此之外禁止讓其他物件的成員存取。

多型(Polymorphism)

這裡可以分為多載(Overloading)、覆寫(Overriding)和多型。

覆寫 Overriding

覆寫的概念在《[基礎概念] 虛擬函式 Virtual Function 是什麼東西?》有稍微提到,意思是子類別可以覆寫父類別的方法內容。

可以參考上述文章,這邊就暫時不再多寫。

多載 Overloading

簡單來說,就是一個方法,透過判斷輸入參數的型態、數量、順序,而執行不同的敘述。拿上面有出現過的例子來說好了,假設我今天有個方法叫做 Area(),可以計算圖形的面積。而圖形的面積有不同的計算方式:

  1. 圓形:半徑 * 半徑 * \(\pi\)
  2. 長方形:長 * 寬

圓形只需要知道半徑,也就是一個參數;長方形需要知道長和寬,也就是兩個參數。我們可以呼叫同一個方法執行不同定義:

  1. Area(4):判斷只有一個參數,執行計算圓面積的公式。
  2. Area(2, 5):判斷輸入了兩個參數,執行長方形面積的公式。

多型 Polymorphism

多型的部分可以在維基百科上的定義用兩句話解決:為不同資料類型的實體提供統一的介面,或使用一個單一的符號來表示多個不同的類型。

簡單來說應該就是上述兩個結合起來的宣告方式。

讓我知道你在想什麼!

Picture of ALEX

ALEX

藍白拖愛好者,一事無成話偏多

Recent Posts

C++

NLP