天天看點

《面向對象的思考過程(原書第4版)》一1.5 究竟什麼是對象

對象是面向對象程式中的基礎材料。使用面向對象技術的程式本質上是對象的集合。舉例來說,一個公司系統包含了代表公司雇員的對象。接下來的小節描述了這些對象的資料和行為。

存放在對象中的資料代表了該對象的狀态。在面向對象術語中,資料被稱為屬性。在圖1-6的例子中,雇員的屬性可以是社會安全号碼、生日、性别、電話号碼等。屬性包含的資訊将不同對象區分開來,在本例中是把不同的雇員區分出來。本章中讨論類時會講述屬性的細節。

《面向對象的思考過程(原書第4版)》一1.5 究竟什麼是對象

對象的行為表示對象可以做什麼。在過程式語言中,可以通過過程、函數及子程式定義行為。在面向對象程式設計術語中,這些行為包含在方法中,你可以通過發送消息的方式來調用方法。在雇員例子中,考慮到雇員對象需要的行為之一是對屬性值進行存取,是以每個屬性會有相應的方法,比如setgender()和getgender()。當另一個對象需要該資訊時,可以給雇員對象發送一個消息來詢問其性别。

毫不奇怪,在本書第1版釋出時,應用程式中已經出現了取值方法(getter)和指派方法(setter),當然還有很多其他的面向對象技術。而且很多技術都與資料相關。通過第11章及第12章,我們可以看到如何使用面向對象的方式組織資料。使用對象最強大、最有趣的一點在于,資料與行為是一個整體,而不是與行為代碼割裂。

xml的出現并不全為了以可移植的方式表示資料。它也有一種替代方式來讓代碼輕松通路資料。在.net技術中,取值方法和指派方法都被認為是資料自身的屬性。

例如,java中定義一個名為name的屬性如下所示:

《面向對象的思考過程(原書第4版)》一1.5 究竟什麼是對象

對應的取值方法和指派方法如下所示:

《面向對象的思考過程(原書第4版)》一1.5 究竟什麼是對象

現在,使用c#.net定義一個名為name的xml屬性,代碼如下所示:

《面向對象的思考過程(原書第4版)》一1.5 究竟什麼是對象

在這種方式中,取值方法和指派方法實際上是屬性name的屬性。

不論采用什麼方式,目的都是一緻的,即控制對屬性的通路。本章中,我想先聚焦于取值方法和指派方法的概念本質。而在第11章及以後的章節中講述面向對象資料時會有更多關于屬性的知識。

取值方法和指派方法

取值方法和指派方法的理念就是資料隐藏。因為其他對象不應該直接操作另一個對象中的資料,而取值方法和指派方法提供了對對象資料的通路控制。取值方法和指派方法有時分别被稱為通路方法(accessor method)和設值方法(mutator method)。

注意,我們隻展示了這些方法的接口,而不是實作。以下幾點列出了使用者需要知道如何實際使用這些方法:

方法名

傳給方法的參數

方法的傳回值

請看圖1-7示範的行為。

圖1-7中,payroll對象包含了一個名為calculatepay()的方法,用于計算具體雇員的薪水。payroll對象需要擷取該雇員的社會安全号碼。為了擷取該資訊,payroll對象需要給employee對象發送一個消息(本例中即調用getsocialsecuritynumber()方法)。基本上,這意味着payroll對象調用employee對象的getsocialsecuritynumber()方法。employee對象接收到該消息并傳回請求的資訊。

《面向對象的思考過程(原書第4版)》一1.5 究竟什麼是對象

uml類圖

由于這是我們看到的第一個類圖,是以進行了一些簡化,缺乏一些類應該具有的結構(例如構造函數)。不過沒關系,第3章中我們會詳細讨論類圖及構造函數。

每個類圖由三部分組成:類名、資料(屬性)、行為(方法)。圖1-8中,employee類圖的屬性區域包含socialsecuritynumber、gender和dateofbirth。方法區域包含了操作這些屬性的方法。你可以使用uml模組化工具來建立和維護類圖以對應真實的代碼。

模組化工具

《面向對象的思考過程(原書第4版)》一1.5 究竟什麼是對象

可視化模組化工具提供了一種方式來使用統一模組化語言(unified modeling language,uml)建立和操作類圖。對于類圖的讨論貫穿本書,第10章會指導如何使用該标記語言。uml類圖可以作為一個工具來可視化類以及類與類之間的關系。本書中對uml的使用僅限于類圖。

本章稍後會介紹類與對象的關系。但現在你可以認為類是建立對象的模闆。當對象被建立時,我們看到對象被執行個體化。是以,如果我們建立三個雇員,實際上是建立了三個employee類的直接執行個體。每個對象都包含了屬性和方法的副本。例如,圖1-9中,一個叫作john的對象(john是該對象的辨別)自身擁有employee類中所有的屬性和方法的副本。叫作mary的雇員類也擁有自己獨立的屬性和方法的副本。這兩個對象各自擁有dataofbirth屬性和getdateofbrith方法的副本。

《面向對象的思考過程(原書第4版)》一1.5 究竟什麼是對象

圖1-9 程式空間

實作問題

請注意沒必要為每個對象的每個方法都實作一個實體副本。其實,每個對象指向了同一個實作。不過這個問題可以交由編譯器/作業系統平台來解決。從概念上來說,你可以認為對象是完全獨立的,各自擁有獨立的屬性和方法。

繼續閱讀