C#與Java(一)
************************************************
關鍵字:繼承
難易度:易
************************************************
最近因為工作需要開展基于C#的研發。我在這里也就寫一點作為Java程序員對于C#的部分感想吧。畢竟能力有限,請各位高手多多點撥。
1.1實現的繼承
C#和Java一樣不能繼承private。但是C++可以在繼承中明確指出要繼承共有的還是私有的。如下:
這個是C#的繼承書寫方法,作為基類的CSharpBaseClass并沒有限定符。

2



3

4

這個是Java了,熟悉吧。






C++的定義如下:






1.2虛函數
把一個基類函數聲明為virtual,該函數就可以在任何派生類中重寫了。
Java的語法中沒有virtual這個詞,但是Java卻徹徹底底的貫徹著這個概念,Java的所有函數都是虛擬的。
C++的朋友可能比較熟悉這個詞吧。對于這一點C#和C++是相同的。但是語法稍微有點不同,C#需要使用override類顯示聲明重寫函數。如下例























1.3隱藏方法
相同簽名的方法在基類和子類都聲明了,但方法不是vitrual。那么實際中到底哪個方法被執行,取決于引用實例的變量類型,而不是實力本身的類型。
我們也不用太擔心這個問題,因為C#會在編譯期給出警告。
1.4調用積累函數的方法
java中我們使用super,C#中使用base。
1.5抽象類和抽象函數
和java一樣使用abstract聲明。
和C++相比,C++的抽象函數被聲明為純虛函數。
1.6密封類和密封方法
在Java中我們把它叫做final。也就是不能繼承的類或不能重載的方法。
1.7構造函數的調用層次
和Java一樣,我就不多說了。這里強調一個特殊的語法格式:
































































結果如預計那樣 :
如果基類含有帶參數的構造函數,派生類不能調用默認基類構造函數。
多參數派生類構造函數,可以調用參數數目不同的基類構造函數。
我們一起來看看為什么這2個結論可以成立:
首先,對于帶參數的基類構造函數在初始化的時候會試圖去調用基類默認構造函數,但在上邊的基類程序里,因為只聲明了帶一個參數的構造函數,所以public Second(string f):base()或者public Second(string f)就不會通過編譯,因為他找不到基類的默認構造函數,只能追加public BaseClass()才會通過。這一點和JAVA是不同的,java的默認構造函數默認是不出現在代碼里的。C#卻一定要寫出來。
<<<== 有錯誤。C#的默認構造函數體制和Java是一樣的。具體如下:
1。父類沒有自定義構造函數的情況下,使用默認構造函數。用戶可以不寫出來。
2。一旦父類有了自定義的構造函數,那么如果要使用無參的默認構造函數就必須要顯示定義。
其次,下邊派生類1個參數、2個參數甚至多個參數的構造函數為什么能訪問只有一個參數的基類構造函數呢?原因是,關鍵字this,上邊的程序改寫如下我想大家就明白了。







2.1修飾符
C#支持下邊的集中修飾符:
public , protected , internal ,private , protected internal
同Java。internal和protected internal是.net framework新增的一個內容。根據定義。
internal在同一個程序集內和public類似,不同的程序集間,public聲明的類或方法仍然可用,但是internal的方法或類則被隱藏。
protected internal合并了protected 和internal,但這是一種or關系,而不是and關系。protected internal成員在同一個程序集的任何代碼都可見,在派生類可見。
2.3接口
接口公約:
不能實例化接口。
接口不能有構造函數或字段。
接口定義也不允許包含運算符重載。
接口定義中還不允許聲明成員上的修飾符。接口成員都是public的,不需要static也不需要virtual。
同Java
接口可以彼此繼承,其方式和類繼承相同。如下:






























告一段落吧。 (つづく)請多提意見,如果有什么不清楚的地方也請你寫下來,一起調查咯。