對象導論之每個對象都有一個接口

每個對象都有一個接口
  亞里士多德大概是第一個深入研究類型(type)的哲學家,他曾提出多魚類和鳥類這樣的概念。所有的對象都是唯一的,但同時也是具有相同的特性和行爲的對象所歸屬的類的一部分。這種思想被直接應用於第一個面向對象怨言Simula-67,它在程序中使用基本關鍵字class來引入新的類型。
  Simula,就像其名字一樣,是爲了開發諸如經典的“銀行出納員問題”(bank teller problem)這樣的仿真程序而創建的。在銀行出納員問題中,有出納、客戶、賬戶、交易和貨幣單位等許多“對象”。在程序執行期間具有不同的狀態而其他方面都相似的對象會被分組到對象的類中,這就是關鍵字class的由來。創建抽象數據類型(類)是面向對象程序設計的基本概念之一。抽象對象類型的運行方式與內置(built-in)類型幾乎完全一致:你可以創建某一類型的變量(按照面向對象的說法,稱其爲對象或實例),然後操作這些變量(稱其爲發送消息或請求;發送消息,對象就知道要做什麼)。每個類的成員或元素都具有某種共性:每個賬戶都有結餘金額,每個出納都可以處理存款請求等。同時,每個成員都有其自身的狀態:每個賬戶都有不同的結餘金額,每個出納都有自己的姓名。因此,出納、客戶、賬戶、交易等都可以在計算機程序中被表示成唯一的實體。這些實體就是對象,每一個對象都屬於定義了特性和行爲的某歌特定的類。
  所以,儘管我們在面向對象程序設計中實際上進行的是創建新的數據類型,但事實上所有的面向對象程序設計語言都使用class這個關鍵詞來表示數據類型。當看到類型一詞時,可將其作爲類來考慮,反之亦然。
  因爲類描述了具有相同特性(數據元素)和行爲(功能)的對象集合,所以一個類實際上就是一個數據類型,例如所有浮點型數字具有相同的特性和行爲集合。二者的差異在於,程序員通過定義類來適應問題,而不在被迫只能使用現有的用來表示機器中的存儲單元的數據類型。可以根據需求,通過添加新的數據類型來擴展編程語言。編程系統欣然接受新的類,並且像對待內置類型一樣地照管它們和進行類型檢查。
  面向對象方法並不是僅侷限於構建仿真程序。無論你是否贊成一下觀點,即任何程序都是你所設計的系統的一種仿真,面向對象技術的應用確實可以將大量的問題很容易地降解爲一個簡單的解決方案。
  一旦類被建立,就可以隨心所欲地創建類的任意個對象,然後去操作它們,就像它們是存在於你的待求解問題中的元素一樣。事實上,面向對象程序設計的挑戰之一,及時在問題空間的元素和解空間的對象之間創建一對一的映射。
  但是,怎樣才能獲得有用的對象呢?必須有某種方式產生對對象的請求,使對象完成各種任務,如完成一筆交易、在屏幕上畫圖、打開開關等等。每個對象都只能滿足某些請求,這些請求有對象的接口(interface)所定義,決定接口的便是類型。以電燈泡爲例來做一個簡單的比喻:
  在這裏插入圖片描述
  Light lt = new Light();
  lt.on();
  接口確定了對某一特定對象所能發出的請求。但是,在程序中必須有滿足這些請求的代碼。這些代碼與隱藏的數據一起構成了實現。從過程型編程的觀點來看,這並不太複雜。在類型中,每一個可能的請求都有一個方法與之相關聯,當向對象發送請求時,與之相關聯的方法就會被調用。此過程通常被概括爲:向某個對象“發送消息”(產生請求),這個對象便知道此消息的目的,然後執行對應的程序代碼。
  上例中,類型/類的名稱是Light,特定的Light對象的名稱是lt,可以向Light對象發出的請求是:打開它、關閉它、將它調亮、將它調暗。你以下列方法創建了一個Light對象:定義這個對象的“引用”(lt),然後調用new方法來創建該類型的新對象。爲了向對象發送消息,需要聲明對象的名稱,並以圓點符號鏈接一個消息請求。從預定義類的用戶觀點來看,這些差不多就是用對象來進行設計的全部。
  前面的圖是UML形式的圖,每個類都用一個方框表示,類名在方框的頂部,你所關心的任何數據成員都描述在方框的中間部分,方法(隸屬於此對象的,用來接收你發給此對象的消息的函數)在方框的底部。通常,只用類名和公共方法被示於UML設計圖中,因此,方框的中部就像本例一樣並未給出。如果只對類型感興趣,那麼方框的底部甚至也不需要給出。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章