突然心血來潮寫這篇Blog,因為昨天那個面試雜錦,其實面向對象都不難啊,也不難理解。但是很多人覺得很恐怖,所以我就在這里發表一下,自己對面向對象的理解。先說下面向對象,我最早接觸面向對象是JAVA里的,那時候學校開了JAVA程序設計。因為自己在高中就自學了C語言啦,所以學JAVA的時候沒啥難度。只是在面向對象的時候有一點點卡機的跡象,為啥?第一,自己一直覺得,繼承和對代碼的復制粘貼沒啥區別啊,為什么要弄個繼承出來。第二,多態,啥叫多態,這個跟繼承又有什么關系。。因為書本的例子可以說,打部分都是簡單的,CLASSA繼承與A,然后輸出。。。就這類說明性的代碼,沒錯這類代碼是很容易說明繼承的關系。但是如何令人從理論轉化為實際,有一定的困難。所以真正要感受到這個還是需要多多的敲下代碼,用心去感受一下,才能理解內涵的。第2次接觸面向對象是在大二第一學期,突然心血來潮想學C++為啥?因為無知- -!為什么說因為自己無知呢?那時候我以為,要實現界面編程只有用C++的MFC去實現,為了學VC++而開始學C++。因為之前有個JAVA,C語言這類從C語言派生出來的編程語系所以學C++速度就快上很多。但是也出現了一個問題,甚至是跟自己學過的JAVA有很大沖突,C++支持多繼承,私有繼承,等這類繼承。所以一開始有點蒙,而已C++還有一個析構函數。C/C++被人罵的最多的,就是它的內存泄露。什么叫內存泄露,我給它的定義是:沒有在適當的時候釋放適當的內存空間。第三次接觸面向對象是C#大二下學期。那時候Net 2.0剛出不是很久。。因為我看過資料,知道2.0比1.1有跨度更新,所以自己那時候決定從2.0入手,二放棄1.1,其實那時候有學C#的沖動的原因是,JAVA太闊了,而且自己大專出生,JAVA在2006年的時候簡直就是遍地開花,什么北大清鳥啊,什么達內啊,什么新東方啊,什么巨匠啊等等這類東西(偷偷說句,其實我蠻鄙視這些培訓的,覺得有些東西是需要靠自己去學的,并不是說在課堂上講下課就可以學到多少,而且我覺得他們的基礎課程和學校的沒太大分別。他們一邊打著鄙視高校教育的時候,一邊做著高校所做的事,所以我覺得比較返感。至于他們的高級課程,我倒是沒有了解,或許有一定的效果,或許而已。。。這個話題就不說下去了,免得人家拍磚)這個到和JAVA差別不算太大。我之所以轉投C#陣型,其實是被開源嚇的,為啥?開源太闊了,學完java基礎學JSP,學完JSP學SSH,學到這里,才發現自己已經浪費了1年多的時間,還沒有入門,打擊啊。讓后被C#的事件模型吸引,跟著開始C#生涯。開始學C#我可是老老實實從基礎學起的呢,畢竟那時候已經決定跟著C#混飯吃了,基礎很重要。
體驗繼承的好處的,你需要學習多一樣東西,那樣東西叫多態。至于多態,等我那天又再心學來潮再寫。
C#里的繼承是可以分為3種的(我自己分的),第一種,實體繼承,第二種虛繼承,第三種接口繼承。有些書籍是這樣分的:實現繼承,接口繼承。
實體繼承:這個是我們經常用的,基類有自己的功能。并允許部分功能被子類掩蓋,也是我們經常看到的繼承。
虛繼承:這個類是我自己區別出來的,因為這個虛繼承是介乎與實體繼承和接口繼承之間,虛繼承是指基類之生命了方法,但這類方法沒有任何實體操作,所有實體操作都必須由子類實現,并且子類都必須事先虛基類的每一個方法。
接口繼承:只繼承函數簽名,沒有繼承任何實現代碼.
我打個比喻,實體繼承可以比喻為一個國家,虛繼承就是類似歐盟這樣的組織,接口繼承就是聯合國。國家是有一定職能的,并且他又行駛這些職能的武力支持,這類職能就是實體繼承的方法。虛繼承,就是你加入了這個組織,你就必須要遵守這些制度。但是歐盟是沒有實體的,也就是沒有職能武力支持,它依靠的是實體子類(加入歐盟的國家)的武力支持。接口繼承,這個聯合國比喻最正確不過。就個名字,什么某些國家掛著它名字出去為非作歹都沒問題。唯一有用的就是他的名字,但是有時候你又不能少了這個名字。
在C#里不支持多繼承,這個不支持多繼承是限制在實體繼承和虛繼承的基礎上的,根據設計C#那個牛人的意思,多繼承所產生的代碼污染代價比繼承來的要大,所以他選擇不支持多繼承,但是需要用到多繼承的情況下,他引入了一個概念,接口。實體繼承只能是一個,接口可以是好多個,就好比如,某個公司只是屬于某個行業,但是它卻擁有很多個榮譽稱號。
上面的分類,只是用來方便我們在什么時候使用什么樣的繼承。
理解完繼承的分類,我就開始介紹繼承的組成,
虛方法:帶有virtual基類函數(方法)聲明,子類使用override修飾。在C#中的虛函數(方法)的概念和標準OOP是一致的,可以在子類中重寫虛函數。在調用方法時,會調用對象類型的合適方法。 因為在C#里面默認情況下都不是虛擬的,但是JAVA在默認情況下是虛擬的。所以必須顯式地聲明為virtual才是虛的(構造函數除外)。關于虛方法上C#和C++是一致的。但是C#子類重寫時候需要加上override修飾。
隱藏方法:當沒有把基類的方法聲明為虛方法的時候,但是派生類又用到了跟基類方法完全相同的名字的方法(不滿足重載的方法),在C#里我們使用關鍵字new來聲明,則表示我們要隱藏一個基類的方法。
當我們沒有使用new,也沒有使用virtual-override的時候,編譯器會隱式地給我們的代碼加上new,并提示一個警告,所以在編寫穩定代碼的時候,少用默認是個比較好的習慣,至少我覺得這個習慣很好。雖然C#現在沒有夸平臺的概念,但是在C++等其他應用的時候,不一樣的平臺就有不一樣的默認方式。當然在C++里我們常用宏來解決這個夸平臺的。跟那個默認值沒有關系,我只是舉例,舉些不確定100%恰當,但是又容易幫助人理解的例子。
例如在我們自己開發服務器端控件件的時候,我們經常用到base 關鍵字的,就是調用基類方法去操作,主要作用是區分重新方法和基類方法。
抽象類;其實就是我上面說的虛基類。有一個比較明顯的特征,有關鍵字abstract因為抽象類和,抽象方法都是沒有具體代碼的,他們的實現具體代碼是依靠子類去實現,例如,有一個基類動物,這個動物是虛基類來的,所有動物我們都讓它具備了行走的方法,讓后人這個子類繼承于動物,老虎這個子類也是繼承于動物,人這個子類的行走方式是用2條腿的,老虎是用4條腿,這樣做的好處就是起到抽象限制作用。我又來一個比如,我給動物下一個定義,你怎么下?最簡單噶,會自己動的物體。就叫動物。好這樣我就定義好了動物是會動的,至于怎么動,是用手動,還是用腳去動,還是用身體去動,沒有沒有細節去區分,只需要知道它動了就行,這個動就是抽象。
接口:接口這個東西雖然沒限制你繼承多少個?但是繼承了接口,證明這個類就會執行某些函數。接口是不能實現實體化的,也就是說她沒有溝造函數,接口只是一個契約,例如你加入某某協會,協會的契約是你需要交會費,同時我們承認你是我們協會。你可以得到協會的內部資料。例如我們熟悉的Dispose()方法,這個方法和C++里的析構函數差不多,用于清理的,它實現了接口IDisposable,如果你有一個類加入了IDisposable協會,那么你將得到權威的Dispose()方法的承認,具有IDisposable會員的合法資格。你加入了聯合國,并且依照聯合國的武力條例,那么你將得到聯合國授權你是正義的。
接口就是給你一個“借口”可以光明正大地去“侮辱(污染)”人家。(掛著聯合國名字光明正大的去干澀它國內政。)
繼承的重點就講完了。至于那些訪問規則就是靠背的,上面那些才是應用繼承的細節額。體現了如何抽象類,如何使用光明正大的污染代碼等一些使用繼承的模糊信息。我沒有參照任何資料去寫這篇文章的,那么講錯了,歡迎大家指出
posted on 2009-06-06 22:00
^乔乔^ 阅读(1624)
评论(2) 编辑 收藏 引用 所属分类:
c++ 、
c#