評論(0

面向對象語言

標籤: 暫無標籤

用於描述的設計是以對象為核心,而對象是程序運行時刻的基本成分。語言中提供了類、繼承等成分。

中科永聯高級技術培訓中心(www.itisedu.com

      面向對象語言(Object-Oriented Language)是一類以對象作為基本程序結構單位的程序設計語言,指用於描述的設計是以對象為核心,而對象是程序運行時刻的基本成分。語言中提供了類、繼承等成分。

      面向對象語言借鑒了20世紀50年代的人工智慧語言LISP,引入了動態綁定和互動式開發環境的思耄皇加?0年代的離散事件模擬語言simula67,引入了類的要領和繼承,成形於70年代的Smalltalk。面向對象語言的發展有兩個方向:一種是純面向對象語言,如Smalltalk、EIFFEL等;另一種是混合型面向對象語言,即在過程式語言及其它語言中加入類、繼承等成分,如C++、Objective-C等。

      面向對象語言刻畫客觀系統較為自然,便於軟體擴充與復用。有4個主要特點:

(1)識認性,系統中的基本構件可識認為一組可識別的離散對象;
(2)類別性,系統具有相同數據結構與行為的所有對象可組成一類;
(3)多態性,對象具有惟一的靜態類型和多個可能的動態類型;
(4)繼承性,在基本層次關係的不同類中共享數據和操作。

      其中,前三者為基礎,繼承是特色。四者(有時再加上動態綁定)結合使用,體現出面向對象語言的表達能力。

      一般認為,較典型的面向對象語言有:

SIMULA67,支持單繼承和一定含義的多態和部分動態綁定;
Smalltalk支持單繼承、多態和動態綁定;
EIFFEL,支持多繼承、多態和動態綁定;
C++,支持多繼承、多態和部分動態綁定。

       四種語言涉及概念的含義雖基本相同,但所用術語有別。


基於類的面向對象語言

      基於類的面向對象語言是面向對象世界里的主流。它包括:

      Simula, 第一個面向對象語言
      Smalltalk, 第一個支持動態類型的語言
      C++, 它的大部分基於類的特性繼承自Simula.等等等等。

      與基於類的語言相對應的是基於對象的面向對象語言。這裡「基於對象」的概念和把Visual Basic叫做基於對象的概念是不同的。這裡的「基於對象」是指一個只以對象為中心,沒有類的概念的語言,類似Python之類的語言。

      現在,我們來介紹一下基於類的面向對象語言的一些共同特徵。

      1.類和對象

讓我們先看一個類的定義:

class cell is

            var contents: Integer :=0;

            method get(): Integer is

                        return self.contents;

            end;

            method set(n:Integer) is

                        self.contents := n;

            end;

end;

 

      一個類是用來描述所有屬於這個類的對象的共同結構的。這個cell類表示的對象擁有一個叫做contents的整數屬性(attribute),這個屬性被初始化成0。它還描述了兩個操作contents的方法。Get和set. 這兩個方法的內容都是很直觀的。Self變數表示這個對象自己。

      對象的動態語義可以這樣理解:

      一個對象在內部被表示為一個指向一組屬性的指針。任何對這個對象的操作都會經過這個指針操作對象的屬性和方法。而當對象被賦值或被當作參數傳遞的時候,所傳遞的只是指針,這樣一來,同一組屬性就可以被共享。

      (注, 有些語言如C++, 明確區分指向屬性組的指針和屬性組本身,而一些其它的語言則隱藏了這種區別)

      對象可以用new從一個類中實例化。準確地說,new C分配了一組屬性,並返回指向這組屬性的指針。這組屬性被賦予了初始值,並包括了類C所定義的方法的代碼。

      下面我們來考慮類型。對一個new C所生成的對象,我們把它的類型記為InstanceTypeOf(c). 一個例子是:

var myCell: InstanceTypeOf(cell) := new cell;

      這裡,通過引入InstanceTypeOf(cell), 我們開始把class和type區分開來了。我們也可以把cell本身當作是類型,但接下來,你就會發現,那樣做會導致混淆的。

      2.方法解析(Method Lookup)

      給出一個方法的調用o.m(……), 一個由各個語言自己實現的叫做方法解析的過程負責找到正確的方法的代碼。(譯者按:是不是想起了vtable了?)。

      直觀地看,方法的代碼可以被嵌入各個單個對象中,而且,對於許多面向對象語言,對屬性和方法的相似的語法,也確實給人這種印象。

      不過,考慮到節省空間,很少有語言這樣實現。比較普遍的方法是,語言會生成許多method suite, 而這些method suite可以被同一個類的對象們所共享。方法解析過程會延著對象內指向method suite的指針找到方法。

      在考慮到繼承的情況,方法解析會更加複雜化。Method suite也許會被組成一個樹,而對一個方法的解析也許要查找一系列method suite. 而如果有多繼承的話,method suite甚至可能組成有向圖,或者是環。

      方法解析可能發生在編譯時,也可能發生在運行時。

      在一些語言中,方法到底是嵌入對象中的,還是存在於method suite中這種細節,對程序員是無關緊要的。因為,所有能區分這兩種模式的語言特性一般在基於類的面向對象語言中都不被支持。

      比如說,方法並不能象屬性一樣從對象中取出來當作函數使用。方法也不能象屬性一樣在對象中被更新。(也就是說,你更新了一個對象的方法,而同一個類的其它對象的該方法保持不變。)

      3. 子類和繼承(Subclassing and Inheritance)

      子類和一般的類一樣,也是用來描述對象的結構的。但是,它是通過繼承其它類的結構來漸進式地實現這個目的。

      父類的屬性會被隱式地複製到子類,子類也可以添加新的屬性。在一些語言中,子類甚至可以override父類的屬性(通過更改屬性的類型來實現)

      父類中的方法可以被複制到子類,也可以被子類override.

一個子類的代碼的示例如下:

subclass reCell of cell is

            var backup: Integer := 0;

            override set(n: Integer) is

                        self.backup := self.contents;

                        super.set(n);

            end;

            method restore() is

                        self.contents := self.backup;

            end;

end;

      對有subclass的方法解析,根據語言是靜態類型還是動態類型而有所不同。

      在靜態類型的語言(如C++, Java)里,父類,子類的method suite的拓撲結構在編譯時就已經確定,所以可以把父類的method suite里的方法合併到子類的method suite中去,方法解析時就不用再搜索這個method suite的樹或圖了。(譯者按:C++的vtable就是這種方法)

      而對於動態類型的語言,(也就是說,父子類的關係是在運行時決定的),method suite就無法合併了。所以,方法解析時,就要沿著這個動態生成的樹或有向圖搜索直到找到合適的方法。而如果語言支持多繼承,這個搜索就更複雜了。

一個生動的比喻:人類原始語言--面向對象語言

       不知道這樣的比喻是不是恰當:人生就象是一段程序, 只不過這段程序是由上帝用特殊的代碼編寫而成,裡面的演算法極其複雜.這世界上誰也不會看懂,誰能看懂誰就是上帝.除非就象拖動播放器一樣去拖動時間,你才會猛然發現後面的事情.但是時間是不能拖動的.至少現在是這樣.於是對將來的無知就使我們有了恐懼 .

      我想也許上帝編寫他的龐大的程序應該綜合了很多語言,而在編寫「human」這個類的時候我想也許他主要用的應該是面向對象這種語言吧.他賦予了我們每個人類對象一些屬性 ,一些行為,並且使之歸類.物以類聚,人以群分,體現的正身屬於什麼類.能做什麼?不能做什麼?而我就屬於那種再平凡不過的替其他代碼服務的方法, 別人只需要調用就可 .

      有的代碼有局限性,寫出來只能在一定的環境才能運行.我們周圍的大自然就是 ,比如高山,大樹,房屋,大海,甚至地球等星球。而有的代碼寫出來以後,可以在任何地方運行.比如面向對象語(JAVA).而我偏偏就屬於前一種代碼,頂多生活在自己的世界就已經是非常幸福了.其實到現在我都沒有達到.而大多數人就屬於後者,走到哪兒都能生存, 都能適應.所以說我們人類的適應力其實是最強的. 還有一種代碼就是亂碼 ,讓人看不懂. 誰也不理解他, 他也不理解這個世界. 由於現代社會的冷漠和溝通的減少,以及人們表達方式所產生的誤會,這種代碼也有很多 .他們孤單寂寞 ,感情得不到宣洩 ,壓抑得不到釋放 ,似被忽略, 不值得提.

      有的代碼寫出來以後什麼用處也沒有, 他的存在只是浪費時間和空間 ,浪費資源而已 .什麼都不做 ,或者說盡做一些毫無用處的事 .其實也不能這麼說 .正如你在大街上看到乞丐一樣 ,也許你會害怕那種情形 ,所以你使自己努力, 奮進 ,最後成為一位傑出的人才. 這都歸於乞丐在你心中留下的陰影 ,只不過我們看不見這種實際存在的作用.而有的代碼功能十分的龐大,服務很多,可以做許多有意義 ,有用的事. 我們當中的掌管技術或藝術的人就屬於這一類. 他們是推動社會的核心力量 ,他們的存在就是讓世界前進 ,發展 ,讓這個世界充滿勃勃生機.然而還有一種代碼, 自己沒有多少的服務和動作, 而是靠調用別的代碼來達到目的. 不要說這種代碼可惡, 這種代碼其實最有用. 通過他的調用 別的代碼才能發揮自己的作用 ,才能體現出價值來. 我們當中也有很多這種類型的人 .比如公司的經理,總裁,地區的市長,國家的主席等,他們通常是上流社會的主導,控制著世界發展的方向. 沒有他們的控制和管理, 恐怕社會將體現不出應有的價值.

       我們每個人都無法看透別人 ,正如類的封裝一樣. 如果要想了解一點的話 ,可以通過消息與其他事物互動 .所以這樣也只是對事物了解了一點點 ,因此不要說你看透了誰 ,你了解透了誰 ,至少你不能了解他的真真的本身屬性.其實很多人所說的掌握了真理只不過是一些事物所表現出來的類似真理的表象而已. 所以我們為人處事應該謙虛, 因為我們知道的只有一丁點 .實際上我們經常只是實列連接 ,就如同父輩和我們這代之間的鴻溝一樣 .彼此都不通過消息去了解 .但有一點就是 我們至少必須了解自己 .給自己定位. 這就是所謂的自知.

      同樣 ,人必須要發展 ,要進步, 如同類的繼承一樣, 子類繼承了父類. 而且他本身還增加了許多功能. 這樣才能提高內涵, 提高自身的價值.而上帝實際上就是用「遺傳」和「變異」來體現這一設計的. 而且類還具有多態性 ,可以繼承他上面的許多的父類. 所以我們要多多向那些比我們優秀的人學習, 繼承他們的優點, 學習他們的智慧. 如果你覺的繼承過來的東西滿足不了你或不適合你, 怎麼辦呢? 不要緊, 上帝編寫程序的時候早就考慮到了. 他允許每個「person」這個實列重寫父類中的方法, 以適應自己本身. 也就是方法覆蓋. 東方曾經就是向西方學習 ,繼承了他們的先進之處, 再結合自己的特點, 走自己的特色道路, 這就是一個很好的列子.

      另外就是介面要多, 這樣才活躍. 很多東西都可以通過介面來了解你的很多特點. 這便是開放 .讓別人來了解自己 ,也讓自己在別人面前表現出自己的價值, 存在的意義. 而有的代碼則相反 ,沒有什麼介面,甚至根本就沒有介面 .把自己孤立起來, 讓人不能理解 .任何一方面都無法與他溝通. 這就會導致自閉 ,而自閉又會導致落後, 挨打 .中國曾經就是由於閉關鎖國,閉門造車而導致發展緩慢,十分落後,而現在就不一樣了,加入了世貿,融入了世界,成為了強國,甚至成為了帶動世界經濟的火車頭,這就是一個很大的轉變.

      程序有重複和選擇結構, 我相信我們人類這道程序也應該是. 比如可以發明時間機器, 直接跳到後面去執行語句, 而我們就走向了未來. 或是再返回去重複執行以前的語句, 就如同我們回到從前, 再去經歷一遍. 當然 ,這是要有條件的, 要根據條件選擇. 而我們要具備的條件就是技術, 這樣才能發明時間機器. 但這就要看上帝要在什麼時候實現這一小目標"時間機器的誕生"

      程序設計總是強調弱耦合,強內聚.而上帝在面向人類對象的設計中也是這樣的. 他是希望我們每個人不要太依賴別人,而是要靠自己的實力去實現願望 . 中國就是這樣, 走自己的特色道路, 堅持自力更生 ,艱苦奮鬥,最終實現了社會主義社會 .

      還有就是包, 裡面的內容十分豐富. 每個類或實列都可以直接或間接享用或吸收裡面的東西. 比如LANG包. 而事實上中國共產黨就屬於這個包, 起到SUPER的作用. 我們每個人都是在黨的懷抱下成長的, 我們每個人都直接或間接的繼承他的優良傳統和作風,才使我們中華民族的每個子女這麼優秀 .因此我們每個人都要愛戴黨,擁護黨,加入黨。

     上帝好象有意偏袒生命這種不同尋常的東西, 在面向對象的時候, 他還賦予每段代碼不同尋常的功能. 那就是代碼本身在適當的時候可以改變自己, 調整自己 ,以適應需要. 這是個了不起的設計. 敢這樣說: 就因為這個設計, 世界才能發展到現在. 這個類的類名叫"life" 是高貴的 ,功能最強的 ,尤其是在"person"這一方面體現的更強烈. 正如我們在失敗的時候可以及時的調整自己的心態, 重新開始. 或者在了解自己很落後的時候 ,可以讓自己去學習, 去工作. 或者說在受到傷害的時候努力讓自己堅持. 也就是說, 在做任何事情的時候可以根據需要隨時改變自己的動作或心態去迎合目標. 這有點象函數 ,能根據不同的參數計算出不同的結果. 而我們的性格和行為就相當於自變數 ,改變自變數, 將改變結果 .或者說就正如方法重載 ,雖然類名是一樣的, 但可以根據參數個數或類型而自己就判定應該調用那一個方法 ,應該做那些動作. 所不同的是, 我們不但可以賦予自己不同的參數 ,我們還能改變自己的演算法方式 .而函數就不行, 演算法方式已經定下了 ,只能由此演算法改變結果而已.因此說這種代碼是高度智慧的, 也就是說 ,上帝在編寫他的時候賦予了他特殊的方法:允許對象調用自己本身去創造方法. 也就是說他把我們設計成了主動對象, 而把其他事物設計成了被動對象 .上帝是希望通過我們人類的主動性去發現事物 ,發現真理, 探索世界. 缺了他 ,世界將是一片荒涼, 如同機械一般 ,沒有激情 ,沒有生機, 就象風穿梭在黑夜.

     所有的程序都是「固定」的, 也就是說編寫好了以後他總是按照程序「本身」去執行 ,不會有任何意外. 對與普通程序, 死機可能是一種意外. 其實不是 ,死機無非就是程序中斷,這也是符合程序本身的. 因為你的程序只能做到這樣:死機的時候中斷. 上帝在設計我們人類的時候也是這樣的. 如果我們有意外, 比如地球毀滅, 太陽壽盡, 那也沒辦法, 因為上帝在編寫程序的時候沒有編寫處理異常的代碼. 也許他編寫了, 只不過這段代碼到後期才能執行, 但誰知道呢. 普通代碼通常是這段代碼執行完以後再去執行那段代碼.也就是所謂的順序執行. 同樣 ,上帝編寫的程序也不列外 .有因必有果, 所有事情的發生一點也不偶然,正如東京的蝴蝶振動一下翅膀,紐約就會傾盆大雨,而其間的一系列連環反應誰也不清楚, 但這一切其實都是已「註定」的.任何人都無法改變自己的「FORTUNE」 你可能會說, 我就可以改變自己的命運, 我要靠自己的努力去改變自己的人生. 恭喜你 !你就是那段具有高度智慧的代碼, 能根據需要隨時改變自己的狀態和行為. 但是, 這個改變本身實際上仍然是上帝賦予你的. 是他老人家安排我們能做什麼 ,不能做什麼。

 

上一篇[天弁七]    下一篇 [頸肋綜合征]

相關評論

同義詞:暫無同義詞