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