A-物件導向說明

1.類別

類別(Class)定義了一件事物的抽象特點。通常來說,類別定義了事物的屬性和它可以做到的(它的行為)。舉例來說,「狗」這個類別會包含狗的一切基礎特徵,例如它的孕育、毛皮顏色和吠叫的能力。類別可以為程式提供模版和結構。一個類別的方法和屬性被稱為「成員」。

我們來看一段虛擬碼:

類別

開始

私有成員:

孕育:

毛皮顏色:

公有成員:

吠叫():

結束

2.物件

物件(Object)是類別的例項。例如,「狗」這個類別列舉狗的特點,從而使這個類別定義了世界上所有的狗。而萊絲這個物件則是一條具體的狗,它的屬性也是具體的。狗有皮毛顏色,而萊絲的皮毛顏色是棕白色的。因此,萊絲就是狗這個類別的一個例項。一個具體物件屬性的值被稱作它的「狀態」。(系統給物件分配內部記憶體空間,而不會給類別分配內部記憶體空間,這很好理解,類別是抽象的系統不可能給抽象的東西分配空間,物件是具體的)

假設我們已經在上面定義了狗這個類別,我們就可以用這個類別來定義物件:

定義萊絲

萊絲.毛皮顏色:=棕白色

萊絲.吠叫()

我們無法讓狗這個類別去吠叫,但是我們可以讓物件「萊絲」去吠叫,正如狗可以吠叫,但沒有具體的狗就無法吠叫。

用個生活上的例子,類別就像是我們的印章,蓋出來的第一個章叫做A。就是物件。蓋出來的第二個章叫做B,B也是物件。A B 跟都適用同一個模子蓋出來。而作為模型的印章,她就是類別。

3.方法

方法(Method)是定義一個類別可以做的,但不一定會去做的事。作為一條狗,萊絲是會吠叫的,因此「吠叫()」就是它的一個方法。與此同時,它可能還會有其它方法,例如「坐下()」,或者「吃()」。 對一個具體物件的方法進行呼叫並不影響其它物件,正如所有的狗都會叫,但是你讓一條狗叫不代表所有的狗都叫。 如下例:

定義萊絲是狗

定義泰爾是狗

萊絲.吠叫()

則泰爾是會吠叫但沒有吠叫的,因為這裡的吠叫只是對物件「萊絲」進行的。

4.繼承

繼承(Inheritance)是指,在某種情況下,一個類別會有「子類別」。子類別比原本的類別(稱為父類別)要更加具體化,例如,「狗」這個類別可能會有它的子類別「牧羊犬」和「吉娃娃犬」。在這種情況下,「萊絲」可能就是牧羊犬的一個例項。子類別會繼承父類別的屬性和行為,並且也可包含它們自己的。我們假設「狗」這個類別有一個方法叫做「吠叫()」和一個屬性叫做「毛皮顏色」。它的子類別(前例中的牧羊犬和吉娃娃犬)會繼承這些成員。這意味著程式設計師只需要將相同的代碼寫一次。 在虛擬碼中我們可以這樣寫:

類別牧羊犬:繼承 定義萊絲牧羊犬

萊絲.吠叫() /* 注意這裡呼叫的是狗這個類別的吠叫方法。 */

回到前面的例子,「牧羊犬」這個類別可以繼承「毛皮顏色」這個屬性,並指定其為棕白色。而「吉娃娃犬」則可以繼承「吠叫()」這個方法,並指定它的音調高於平常。子類別也可以加入新的成員,例如,「吉娃娃犬」這個類別可以加入一個方法叫做「顫抖()」。設若用「牧羊犬」這個類別定義了一個例項「萊絲」,那麼萊絲就不會顫抖,因為這個方法是屬於吉娃娃犬的,而非牧羊犬。事實上,我們可以把繼承理解為「是」。例如,萊絲「是」牧羊犬,牧羊犬「是」狗。因此,萊絲既得到了牧羊犬的屬性,又繼承了狗的屬性。 我們來看虛擬碼:

類別吉娃娃犬:繼承

開始

公有成員:

顫抖()

結束

類別牧羊犬:繼承

定義萊絲牧羊犬

萊絲.顫抖() /* 錯誤:顫抖是吉娃娃犬的成員方法。 */

當一個類別從多個父類別繼承時,我們稱之為「多重繼承」。多重繼承並不總是被支援的,因為它很難理解,又很難被好好使用。