在面向對象的程序設計中,由于C++的引入而顯得尤為突出的一個問題是:所有類最終是否都應從單獨一個基礎類繼承。在 Java中(與其他幾乎所有OOP語言一樣),對這個問題的答案都是肯定的,而且這個終級基礎類的名字很簡單,就是一個 “Object”。這種“單根結構”具有許多方面的優點。 單根結構中的所有對象都有一個通用接口,所以它們最終都屬于相同的類型。另一種方案(就象C++那樣)是我們不能保證 所有東西都屬于相同的基本類型。從向后兼容的角度看,這一方案可與C模型更好地配合,而且可以認為它的限制更少一 些。但假期我們想進行純粹的面向對象編程,那么必須構建自己的結構,以期獲得與內建到其他OOP語言里的同樣的便利。 需添加我們要用到的各種新類庫,還要使用另一些不兼容的接口。理所當然地,這也需要付出額外的精力使新接口與自己 的設計方案配合(可能還需要多重繼承)。為得到C++額外的“靈活性”,付出這樣的代價值得嗎?當然,如果真的需要— —如果早已是C專家,如果對C有難舍的情結——那么就真的很值得。但假如你是一名新手,首次接觸這類設計,象Java那 樣的替換方案也許會更省事一些。 單根結構中的所有對象(比如所有Java對象)都可以保證擁有一些特定的功能。在自己的系統中,我們知道對每個對象都 能進行一些基本操作。一個單根結構,加上所有對象都在內存堆中創建,可以極大簡化參數的傳遞(這在C++里是一個復雜 的概念)。 利用單根結構,我們可以更方便地實現一個垃圾收集器。與此有關的必要支持可安裝于基礎類中,而垃圾收集器可將適當 的消息發給系統內的任何對象。如果沒有這種單根結構,而且系統通過一個句柄來操縱對象,那么實現垃圾收集器的途徑 會有很大的不同,而且會面臨許多障礙。 由于運行期的類型信息肯定存在于所有對象中,所以永遠不會遇到判斷不出一個對象的類型的情況。這對系統級的操作來 說顯得特別重要,比如違例控制;而且也能在程序設計時獲得更大的靈活性。 但大家也可能產生疑問,既然你把好處說得這么天花亂墜,為什么C++沒有采用單根結構呢?事實上,這是早期在效率與控 制上權衡的一種結果。單根結構會帶來程序設計上的一些限制。而且更重要的是,它加大了新程序與原有C代碼兼容的難 度。盡管這些限制僅在特定的場合會真的造成問題,但為了獲得最大的靈活程度,C++最終決定放棄采用單根結構這一做 法。而Java不存在上述的問題,它是全新設計的一種語言,不必與現有的語言保持所謂的“向后兼容”。所以很自然地, 與其他大多數面向對象的程序設計語言一樣,單根結構在Java的設計方案中很快就落實下來。 --------------- 這就像MFC里CObject的作用,無論是CWin還是CFile都可以上朔的CObject。 C#和JAVA是極為相像的。c#里object對象類型是所有類型之母,它是其它類型最根本的基類。因為它是所有對象的基類, 所以可把任何類型的值賦給它。例如,一個整型: object theObj = 123; 對于C++程序員來說:object并不等價于void*。無論如何,忘掉指針總是個好主意。
正因為這種單根結構,我們可以非常容易的做cast,包括up-cast和down-cast,也就是說:在繼承樹里向上造型up-cast或 向下造型down-cast。 在C#里單根結構還成為了C#獨特的加框(作為一個對象利用)消框技術的理論基礎。
C#利用單根結構實現在C++里利用Template完成的功能。但我覺得C#沒有Template是一大損失。畢竟Template非常好的說。
|