類別


類別是物件導向領域裡最基礎的概念,也是物件導向分析和設計的基石。

所謂類別,就是站在個人的觀察角度,具有相似點的事物,就是同一類。


 

物件導向類別


物件導向的類別由兩部份組成:屬性方法

屬性:類別具有的特性
方法:類別具有的功能

實際設計程式時,可以用『屬性是名詞,方法是動詞』來判斷。

舉例來說:
這張數位影像的長度為 100 像素,寬度為 50 像素,色彩深度為 24 位元,這裡的長寬及色彩深度就是『數位影像』的屬性;

想獲取點位置在 X 50 像素,Y 在 20 像素的 RGB 彩色值,這裡的『獲取彩色值』就是『數位影像』的方法。

設計屬性的一個基本原則:屬性最小化原則,即『屬性不可再分』。

設計方法看似簡單,看到動詞就是一個方法,但實際操作遠沒這麼簡單。舉例來說:獲取彩色值用在 24 位元影像、32 位元影像跟 8 位元影像,都是同一個方法嗎?

如果都在同一個方法內,這個方法如何區分要獲取多少位元的數位影像呢? 只能增加一堆 if-else 來區分。 如果後續要新增獲取不同彩色空間的彩色值時,不就只能一直增加判斷式,變成大雜燴。

這裡引出設計方法的一個基本原則:方法單一化原則,即『一個方法只做一件事』。

範例程式碼:

 


 

物件


物件就是一個真實存在的類別,物件導向是對現實世界的模擬,那物件就是現實世界存在的『物體』。

真正在軟體運行過程的是『物件』,而不是『類別』。

『類別』是程式撰寫時,由程式人員分析歸納而來。

軟體類別:軟體設計過程中歸納總結出來的分類

軟體物件:軟體實際運行過程中存在的物件。

軟體類別是對現實類別的模擬,但不是簡單的等同。除了實作現實類別相對應的功能,還會創造出許多現實中不存在的類別。

這個創造過程正是各種設計方法設計模式設計原則大顯身手的地方。


 

抽象類別


抽象類別是一種特殊的類別,它只能用於繼承,不能用來產生實體為具體的物件。

為什麼需要抽象類別? 為何要設計一種只能繼承,而不能產生實體的類別?

設計的角度來看,抽象類別是根據類別抽象出來的,例如從鳳梨、芭樂、柳丁幾個普通類別,抽象出水果這個類別。但真的吃的時候,並沒有辦法吃的一個名為水果的東西。

實作的角度來看,抽象類別與實作類別的不同之處在於:有的抽象類別擁有抽象方法(方法只有宣告,沒有定義),子類別必須自己定義這些抽象方法,而不能像普通的方法一樣,透過繼承就能獲得父類別的方法。


 

物件導向的三大核心特徵


封裝繼承多型是物件導向的三大核心特徵,判斷一種程式語言是否為物件導向的程式語言,就看其是否支援這三大核心特徵。

封裝資料的主要原因是『保護隱私』。在程序導向的設計中,資料結構公開的,任何能取得資料的人都可以隨意修改,也允許以不同的方式修改。

如果資料被改錯了,那麼其他依賴此資料的函式會受到影響,甚至造成程式崩潰

物件導向的類別封裝屬性後,對屬性的修改只能透過類別的方法進行,一來不會曝露內部的具體屬性;二來對屬性都是統一的操作,不會出現亂修改的情況。

封裝方法的主要原因是『隔離複雜度』。每個類別只需要關注自己負責的功能如何完成即可,如果需要其他類別配合,僅需呼叫類別的方法,而不用瞭解其內部的具體實作

在現實世界中也常看到『隔離複雜度』的例子。例如想看電視只要輕輕一按搖控器按鈕,就可以看到電視節目的影像了,究竟電視機怎麼運作的,大多數人不知道也不關心。

讓我們用封裝範例來解釋『無封裝』的程序導向和『有封裝』的物件導向差在哪裡。

程序導向 = 演算法 + 資料結構

這裡的資料結構是公開的,每個地方都能看到和引用,否則程序導向中的各個處理流程就沒辦法處理。

實作程式碼如下:


物件導向 = 物件 + 互動

實作程式碼如下:

 



物件導向的封裝有三種方式


public
這種方式就是不封裝,直接對外公開

protected
這種封裝方式對外不公開,但對朋友(friend)子類別公開。

private
這種封裝方式對誰都不公開。


 

繼承


繼承是物件導向語言最基本的特徵,如果一種語言沒有繼承機制,就說不上是真正的物件導向語言。

在物件導向中,繼承的實際意義可以用遺傳來形容,程式設計師決定父類別遺傳什麼給子類別。


 

多型


在物件導向領域中,多型的真正涵意是:使用指向父類別指標參照,便能呼叫子類別物件

以下用實作程式碼來說明:


多型的特性,在物件導向程式設計領域具有十分重要的作用。多型遮罩了子類別物件的差異,允許呼叫者寫出通用的程式碼,而無須針對每個子類別撰寫不同的程式碼。

arrow
arrow

    OtakuYeh 發表在 痞客邦 留言(0) 人氣()