C#與Java(一)************************************************關(guān)鍵字:繼承難易度:易************************************************最近因?yàn)楣ぷ餍枰_展基于C#的研發(fā)。我在這里也就寫一點(diǎn)作為Java程序員對于C#的部分感想吧。畢竟能力有限,請各位高手多多點(diǎn)撥。1.1實(shí)現(xiàn)的繼承C#和Java一樣不能繼承private。但是C++可以在繼承中明確指出要繼承共有的還是私有的。如下:這個是C#的繼承書寫方法,作為基類的CSharpBaseClass并沒有限定符。
這個是Java了,熟悉吧。
C++的定義如下:
1.2虛函數(shù)把一個基類函數(shù)聲明為virtual,該函數(shù)就可以在任何派生類中重寫了。Java的語法中沒有virtual這個詞,但是Java卻徹徹底底的貫徹著這個概念,Java的所有函數(shù)都是虛擬的。C++的朋友可能比較熟悉這個詞吧。對于這一點(diǎn)C#和C++是相同的。但是語法稍微有點(diǎn)不同,C#需要使用override類顯示聲明重寫函數(shù)。如下例
1.3隱藏方法相同簽名的方法在基類和子類都聲明了,但方法不是vitrual。那么實(shí)際中到底哪個方法被執(zhí)行,取決于引用實(shí)例的變量類型,而不是實(shí)力本身的類型。我們也不用太擔(dān)心這個問題,因?yàn)镃#會在編譯期給出警告。1.4調(diào)用積累函數(shù)的方法java中我們使用super,C#中使用base。1.5抽象類和抽象函數(shù)和java一樣使用abstract聲明。和C++相比,C++的抽象函數(shù)被聲明為純虛函數(shù)。1.6密封類和密封方法在Java中我們把它叫做final。也就是不能繼承的類或不能重載的方法。
1.7構(gòu)造函數(shù)的調(diào)用層次和Java一樣,我就不多說了。這里強(qiáng)調(diào)一個特殊的語法格式:
結(jié)果如預(yù)計(jì)那樣 :如果基類含有帶參數(shù)的構(gòu)造函數(shù),派生類不能調(diào)用默認(rèn)基類構(gòu)造函數(shù)。多參數(shù)派生類構(gòu)造函數(shù),可以調(diào)用參數(shù)數(shù)目不同的基類構(gòu)造函數(shù)。我們一起來看看為什么這2個結(jié)論可以成立:首先,對于帶參數(shù)的基類構(gòu)造函數(shù)在初始化的時候會試圖去調(diào)用基類默認(rèn)構(gòu)造函數(shù),但在上邊的基類程序里,因?yàn)橹宦暶髁藥б粋€參數(shù)的構(gòu)造函數(shù),所以public Second(string f):base()或者public Second(string f)就不會通過編譯,因?yàn)樗也坏交惖哪J(rèn)構(gòu)造函數(shù),只能追加public BaseClass()才會通過。這一點(diǎn)和JAVA是不同的,java的默認(rèn)構(gòu)造函數(shù)默認(rèn)是不出現(xiàn)在代碼里的。C#卻一定要寫出來。<<<== 有錯誤。C#的默認(rèn)構(gòu)造函數(shù)體制和Java是一樣的。具體如下:1。父類沒有自定義構(gòu)造函數(shù)的情況下,使用默認(rèn)構(gòu)造函數(shù)。用戶可以不寫出來。2。一旦父類有了自定義的構(gòu)造函數(shù),那么如果要使用無參的默認(rèn)構(gòu)造函數(shù)就必須要顯示定義。其次,下邊派生類1個參數(shù)、2個參數(shù)甚至多個參數(shù)的構(gòu)造函數(shù)為什么能訪問只有一個參數(shù)的基類構(gòu)造函數(shù)呢?原因是,關(guān)鍵字this,上邊的程序改寫如下我想大家就明白了。
2.1修飾符C#支持下邊的集中修飾符:public , protected , internal ,private , protected internal同Java。internal和protected internal是.net framework新增的一個內(nèi)容。根據(jù)定義。internal在同一個程序集內(nèi)和public類似,不同的程序集間,public聲明的類或方法仍然可用,但是internal的方法或類則被隱藏。protected internal合并了protected 和internal,但這是一種or關(guān)系,而不是and關(guān)系。protected internal成員在同一個程序集的任何代碼都可見,在派生類可見。2.3接口接口公約:不能實(shí)例化接口。接口不能有構(gòu)造函數(shù)或字段。接口定義也不允許包含運(yùn)算符重載。接口定義中還不允許聲明成員上的修飾符。接口成員都是public的,不需要static也不需要virtual。同Java接口可以彼此繼承,其方式和類繼承相同。如下:
告一段落吧。 (つづく)請多提意見,如果有什么不清楚的地方也請你寫下來,一起調(diào)查咯。
Powered by: BlogJava Copyright © -=Kinohl=-