C++是一種混合式(hybrid)的程式語言,它繼承C語言的程序式的設計典範(paradigm),也結合如同SmallTalk語言一般的物件導向設計。
物件導向設計的好處在哪裡呢?引用原創人的話:「(C++語言)得以在清晰的、具擴充性的、易於維修的而且又不損及效率的情況下,進行結構化的程式設計」
物件導向設計的三大基本精神:
A.封裝(Encapsulation)
封裝是一個把資料和演算法綑綁在一起的機制,以便隱藏一些繁瑣的細節,使其內部的資料受到更安全的保障,免得無意間的遭到綽物的資料存取。另一方面,透過封裝的界面,使用者(或程式設計師)以一種整體的方式來理解和使用這個封裝的實體,而不致於受到太多實作(implementation)細節的干擾。這個封裝的實體就是物件(object)。一個物件必然包含一些屬性(attributes),以及一些可以修改或存取這些屬性的方法。在C++語言當中,物件的屬性是藉由資料來表示,而物件的方法就是演算法了。
在一個物件內部,我們若將某些資料指定成private,則任何物件以外的方法都無法存取或修改它,另外如果資料被指定為protected,那麼它允許被存取或修改的條件就被放寬了一些,至少,所有繼承這個物件的方法都可以直接使用到這些資料。
封裝概念提供C++語言彈性化的資料安全性的設計。除此,它讓程式設計師可以創造自己的資料型態(data type),C++語言有一些基本的資料型態,如整數(int)、字元(char)、浮點數(float)等等,我們可以將各種基本的資料型態封裝成一個物件實體。譬如我們定義一個新的資料型態叫做person,它可以包含有出生年、月、日、姓名、性別等基本資料,一旦我們使用person的物件,就如同使用整數、字元等基本資料一樣方便快速。這個特性使得程式設計師可以用相當直覺的方式來從事模組化的程式設計。
B.多型(Polymorphism)
多型的特徵是「一個界面,多重方法(one interface, multiple methods)」。也就是說,一個界面可以允許不同種類的使用方式。至於被選擇的特定使用方法是根據使用當時的情況的特性而定。
舉一個實例說明。如果把汽車油門踏板是為一個界面(它執行加油的動作),當我們想要車子稍微加速,就輕踩踏板,想要加加速更快就重踩踏板,不管是使用98無鉛汽油、95無鉛汽油或柴油的汽車,這個操作界面都是一樣的。我們很難想像,每當我們換開一輛車,就要重新學習一次加油的操作方式有多麼不便。
對於程式設計,這個原理是類似的。比方我們想設計兩個矩陣相加的界面(C++函式),通常我們馬上會想到矩陣的元素均為實數,所以我們會設計兩個實數(符點數)矩陣相加的界面;但是立刻地,我們會發現在某些機會,這兩個矩陣可能是整數的矩陣,那麼就要再設計另一個界面(C++函式)來執行兩個整數矩陣相加的運算;萬一有一個矩陣是整數矩陣,另一個是實數矩陣,那麼又要另一個界面來執行了。顯而易見,這種方式有如為使用不同汽油的汽車設計不同的使用者界面一樣,叫人無法忍受。
多型應用來整合那些功能一樣,但使用不同資料的界面。這個機能大幅降低了程式的複雜度,並使程式更易於理解和使用。至於如何選擇正確的界面?這個工作是由編譯器根據界面應用時的情況來決定,程式設計師無需操心。
C. 繼承(Inheritance)
繼承是物件導向程式設計的一個重要概念。它使得程式中的一個物件被產生時就可以立即擁有別的物件的一些屬性和方法。它與「分類」或「階層」的概念有密切的聯繫,而這些概念在真實世界中已經被相當普遍的應用。譬如,美國五爪蘋果和富士山蘋果這兩類蘋果都屬於「蘋果」這個大類別,而蘋果這個類別則包含在「水果」這個更大的類別,至於「水果」這個類別又包含在「食物」的類別中。
沒有「類別」和「階層」的觀念,每一個物件都必須單獨地、完整地定義它們的所有屬性和方法,而這些屬性和方法極可能絕大多數都是重複的,程式設計師必須不厭其煩的並且小心的(因為可能有部分屬性有細微的差異)重複為每一個物件做個別的設計。在一個大型的程式計畫中,這可能是一件非常辛苦的工作。
藉由分類(classification),我們把許多具有相同屬性和方法的物件集合成一個類別(class)—例如「水果」,一旦完成這個類別的設計工作,而讓一些有部分比例屬性相同,但有部分差異的物件形成另一個類別—例如「蘋果」,讓它繼承前一個類別(水果),則在「蘋果」的類別中,我們無需去定義那些已經存在於「水果」類別中的方法和屬性。如此,我們就可以節省很多重複定義的工作時間,程式也會變得非常精簡。更重要的是,一旦我們在必要時修改了某個上層類別—如「水果」的屬性,則其繼承者—如「蘋果」會自動隨之更改,而不需要程式設計師動手去修改每一個出現這個屬性的類別。
這確實是一個令程式設計師非常方便的特性。使用「繼承」,我們可以以直覺的方式將真實世界的問題抽象化,進而在最短時間內設計出簡潔的、高度可靠的程式。
內容引用 : http://ccy.dd.ncu.edu.tw/~chen/course/Cpp/ch1/index.htm
留言列表