1.2 對(duì)象的接口
亞里士多德或許是認(rèn)真研究“類型”概念的第一人,他曾談及“魚(yú)類和鳥(niǎo)類”的問(wèn)題。在世界首例面向?qū)ο笳Z(yǔ)言Simula-67中,第一次用到了這樣的一個(gè)概念:
所有對(duì)象——盡管各有特色——都屬于某一系列對(duì)象的一部分,這些對(duì)象具有通用的特征和行為。在Simula-67中,首次用到了class這個(gè)關(guān)鍵字,它為程序引入了一個(gè)全新的類型(clas和type通常可互換使用;注釋③)。
③:有些人進(jìn)行了進(jìn)一步的區(qū)分,他們強(qiáng)調(diào)“類型”決定了接口,而“類”是那個(gè)接口的一種特殊實(shí)現(xiàn)方式。
Simula是一個(gè)很好的例子。正如這個(gè)名字所暗示的,它的作用是“模擬”(Simulate)象“銀行出納員”這樣的經(jīng)典問(wèn)題。在這個(gè)例子里,我們有一系列出納員、客戶、帳號(hào)以及交易等。每類成員(元素)都具有一些通用的特征:每個(gè)帳號(hào)都有一定的余額;每名出納都能接收客戶的存款;等等。與此同時(shí),每個(gè)成員都有自己的狀態(tài);每個(gè)帳號(hào)都有不同的余額;每名出納都有一個(gè)名字。所以在計(jì)算機(jī)程序中,能用獨(dú)一無(wú)二的實(shí)體分別表示出納員、客戶、帳號(hào)以及交易。這個(gè)實(shí)體便是“對(duì)象”,而且每個(gè)對(duì)象都隸屬一個(gè)特定的“類”,那個(gè)類具有自己的通用特征與行為。
因此,在面向?qū)ο蟮某绦蛟O(shè)計(jì)中,盡管我們真正要做的是新建各種各樣的數(shù)據(jù)“類型”(Type),但幾乎所有面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言都采用了“class”關(guān)鍵字。當(dāng)您看到“type”這個(gè)字的時(shí)候,請(qǐng)同時(shí)想到“class”;反之亦然。
建好一個(gè)類后,可根據(jù)情況生成許多對(duì)象。隨后,可將那些對(duì)象作為要解決問(wèn)題中存在的元素進(jìn)行處理。事實(shí)上,當(dāng)我們進(jìn)行面向?qū)ο蟮某绦蛟O(shè)計(jì)時(shí),面臨的最大一項(xiàng)挑戰(zhàn)性就是:如何在“問(wèn)題空間”(問(wèn)題實(shí)際存在的地方)的元素與“方案空間”(對(duì)實(shí)際問(wèn)題進(jìn)行建模的地方,如計(jì)算機(jī))的元素之間建立理想的“一對(duì)一”對(duì)應(yīng)或映射關(guān)系。
如何利用對(duì)象完成真正有用的工作呢?必須有一種辦法能向?qū)ο蟀l(fā)出請(qǐng)求,令其做一些實(shí)際的事情,比如完成一次交易、在屏幕上畫(huà)一些東西或者打開(kāi)一個(gè)開(kāi)關(guān)等等。每個(gè)對(duì)象僅能接受特定的請(qǐng)求。我們向?qū)ο蟀l(fā)出的請(qǐng)求是通過(guò)它的“接口”(Interface)定義的,對(duì)象的“類型”或“類”則規(guī)定了它的接口形式。“類型”與“接口”的等價(jià)或?qū)?yīng)關(guān)系是面向?qū)ο蟪绦蛟O(shè)計(jì)的基礎(chǔ)。
下面讓我們以電燈泡為例:
Light lt = new Light();
lt.on();
在這個(gè)例子中,類型/類的名稱是Light,可向Light對(duì)象發(fā)出的請(qǐng)求包括包括打開(kāi)(on)、關(guān)閉(off)、變得更明亮(brighten)或者變得更暗淡(dim)。通過(guò)簡(jiǎn)單地聲明一個(gè)名字(lt),我們?yōu)長(zhǎng)ight對(duì)象創(chuàng)建了一個(gè)“句柄”。然后用new關(guān)鍵字新建類型為L(zhǎng)ight的一個(gè)對(duì)象。再用等號(hào)將其賦給句柄。為了向?qū)ο蟀l(fā)送一條消息,我們列出句柄名(lt),再用一個(gè)句點(diǎn)符號(hào)(.)把它同消息名稱(on)連接起來(lái)。從中可以看出,使用一些預(yù)先定義好的類時(shí),我們?cè)诔绦蚶锊捎玫拇a是非常簡(jiǎn)單和直觀的。