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