物件導向OOP基礎概論 (以Delphi為例)

(一)、 何謂OO(Object Oriented)物件導向的程式語言

1. 類別與物件

傳統的程式設計概念將程式碼與資料視為分離的個體,程式雖然可以使用存取資料,但是資料並沒有受到保護,任何人都可以不當的存取資料﹔但是物件導向的程式設計則將程式與資料視為不可分離的實體,程式當然還是可以存取資料,只不過得勞駕物件當中的Method來幫你存取。

不過究竟什麼是類別﹔物件又是什麼?!許多初學者常感到疑惑的問題,我想我可能無法讓你聞道或是摸到物件,不過告訴你到哪裡找到相關資訊﹔而事實上類別(Class)是一些物件的靜態定義,它就是定義著一些構成其類別之物件的資料型態及程式碼,有些初學者以為類別與物件沒什麼不同,那我想它還沒真正接觸了解一個類別,其實這連程式碼的定義結構都不同,物件就好比是類別當中的一個變數,而最大的差別就是它不只是當一般變數而已,物件可以是定義的資料型態或是方法(Method)、程序(Procedure)、函式(Function)。

2. 物件的內容

在Delphi環境中到處是物件,你在元件盤(Object Inspector)上所看到的,還有程式設計所用到的元件,或者某些物件的特性就是一個物件,如或一般表單(Form)、Button、Memo、CheckBox等等可視元件(視覺化的看的見的)上都會有的Font屬性、或MainMenu元件的Items屬性都是一個物件,甚至表單本身也是個物件,一般我們要定義一個物件會先定義這個物件的類別,如圖一:當Delphi開一個新Application Project時就已經幫我們建立起一個繼承TFormForm1類別,此類別中我們使用了一個TButton元件(VCL類別),也使用了TButton的Click方法,記住:在Delphi中你所看到的以T開頭的即是一個類別〔也就是一個VCL類別,因為Delphi的Framework是VCL(Visual Component Library)〕,如此範例中我們使用了TFormTButton這兩個類別。

圖(一):

image

(二). OO(Object Oriented)的基本特性

(1). Encapsulation.封裝

(2). Inheritance繼承

(3). Polymorphism.多型

◎封裝◎

封裝也稱做資料隱藏,算是物件導向當中蠻重要的一個觀念,良好的物件導向的程式語言其資料都應該被隱藏起來,只透過其介面(Class)所提供之方法(Method)、屬性(Property)能被外界存取,其實這個觀念很簡單,將封裝想程式一個提供某些功能的黑盒子,而在外面你看不出此功能是如何做出來的,你只要知道如何使用它就可以了,如手機你只要知道如何使用按鍵播出電話,你看不見也不知道它是如何發出電波的,你只能透過按鍵變更或修改手機的設定值,你若自己拆開調整那可能使手機變的不正常。同樣的物件也有自己行為模式,只有設計物件的作者本身才了解物件的行為模式,您必須透過物件本身的屬性修改其行為模式,以免資料遭到竄改,使物件產生不正常的行為模式。

◎繼承◎

所謂繼承,就是從既有的類別中延伸出新的類別,如公車、箱型車、房車、都繼承汽車的主要特性,那麼可以說不管什麼車都是汽車的子類別,物件導向的程式語言透過繼承的特性便可避免撰寫相同的程式碼,也就是說你可以繼承某向物件或類別下再加以修改其屬性,新增加一些方法、功能,使其功能更強大更符合你的需求,所以你可以將你常用的功能加以物件化,必要時在加以使用。而在繼承的觀念中還有所謂的多重繼承,也就是子類別不只擁有一個父類別,就是它可以同時有A類別的Caption屬性同時也有B類別的LoadPicture方法,更簡單的說如同兒子同時繼承父親以及母親的屬性行為模式,不過使用多重繼承會使程式更加複雜,目前Delphi仍採單一繼承方式,C++則可多重繼承。

◎多型◎

多型,許多人認為這是物件導向觀念中較難理解的觀念,其實這也是物件導向另一個相當重要的一個觀念,如果就字面的意思來說,它指一個物件可以有多種型態,這個型態還是動態的,也就是說它可以依照物件的類別當時的型態來覆寫或呼叫不同類別的同名方法,什麼是同名方法?:如TADOQuery、TTable、TADODataSet物件都有SQL物件及Add SQL方法,或是透過繼承其他類別Override其中的方法,當然在Delphi中必須宣告為VirtualDynamic才表示可被Override(重寫)〔詳細關鍵字會在第六章Object Pascal程式設計中詳細加以說明〕,更詳細的說法=它可以在程式RunTime時依照他當時的型態而有不同的行為模式,使程式更活化,有高度的延展性。

◎介面◎

介面可說是物件導向之後出現的新興觀念,他有別於傳統的物件導向的實作繼承,它所強調的是以介面為基礎的設計方式=>如微軟提出的COM(Component Object Model),COM具有極佳的物件封裝架構,強調介面與實作分開,傳統繼承會對父類別產生相依性,無形中限制了延展性,在COM中對介面的繼承只會對介面產生相依性,在介面不改的情況之下實作部分怎麼修改都不會對其他COM的Client產聲影響,就觀念上來說這叫做黑盒子重複使用,Interface的Client(也就是COM的Client)並不需要知道Interface Server(COM Server)內部如何實作這個方法,它只要知道如使用呼叫就好。而且實作繼承和介面都提供了多型的能力,不它們的封裝卻有很大的不同,介面有多型??..這意味同型態的介面可以轉型!!..這就達到了多型的能力..有興趣的話我在其他章節中在深入討論。

留言

這個網誌中的熱門文章

軟體工程師 - 成長的 10 個階段

常見的程式碼壞味道(Code Smell or Bad Smell)

什麼是 gRPC ?