在現有類(稱為基類、父類)上建立新類(稱為派生類、子類)的處理過程稱為繼承。通俗來講就是從父輩身上繼承點特徵。派生類能自動獲取基類(除了建構函式和析構函式(私有成員)的所有成員),可以在派生類中新增新的屬性和方法擴充套件其功能。
1.類使用繼承時,只需要寫一次**
編寫c#程式時,通常會建立一些類來表示真實世界中的事物,這些事物之間往往會存在關聯。類之中之所以存在類似的**。正是因為他們表示的真實事物有類似的行為。
2.建立類模型:從一般到特定
c#程式使用了繼承,因為程式會對真實事物建模,而繼承可以模仿實際事物之間的關係,真是世界中的事物往往存在於乙個層次體系中,從一般到特定,相應的程式中的類層次體系也是如此。在類模型中,層次體系結構中較低的類繼承自它上面的類。
▲例子:怎樣設計乙個動物園模擬系統?
第一步:找出動物共同的特點。
第二步:構建乙個基類,提供動物共有的全部特點。(基類中的字段、屬性和方法會為繼承自這個基類的所有動物提供共同的狀態和行為)。
第三步:找出各個動物的哪些行為與基類有所不同,或者哪些行為在基類中根本沒有。
第四步:查詢有共同特點的類。
第五步:完成層次體系。
3.使用繼承避免子類中出現重複**
關於重複**的弊端你應該已經很清楚了。重複**很難維護,而且總是讓人很頭疼。
4.子類改變所繼承的這個某個方法行為時,我們成為它覆蓋了這個方法。
5.建立類的乙個鏈,這些類形成繼承關係,從最上層的基類一直鄉下繼承。
6.建立類層析體系。
建立類時,最上面乙個是基類,子類放在它下面,而這些子類本身又有自己的子類,此時建立的就是乙個類層次體系。這就不只是能夠避免重複**了,也容易維護。
7.每個子類都擴充套件其基類
子類並不只是繼承其基類的方法。為乙個類增加繼承關係時,所做的就是對已經構建的類進行擴充套件,為他增加基類中的所有字段、屬性和方法。子類從乙個基類繼承時,積累中所有字段、屬性和方法都會自動增加到子類。
8.使用冒號繼承基類
編寫乙個類是,可以使用乙個冒號「:」使他繼承乙個基類。這樣這個類就成為了乙個子類,並得到被繼承類(基類)的所有字段、屬性和方法。
▲例:
class vertebrate
★問:為什麼箭頭向上指,從子類指向基類?如果箭頭向下指,這個圖不是更好看一些嗎?
答:也許看上去會漂亮一些,不過這樣就不正確了。建立乙個類並讓他繼承另乙個類時,會把這種關係建立在 子類中,基類仍保持原樣。如果從基類的角度來考慮這一點是很有道理的。增加乙個從基類繼承的子類時,積累的行為完全沒有變化。積累甚至不知道這個新類是從他繼承的,他的方法屬性欄位仍保持不變。不過子類肯定會改變行為,子類的每乙個例項都會自動地得到基類的所有屬性、欄位和方法,而所有這些只需要增加乙個冒號就可以輕鬆得到,正是因為這個原因,圖中的箭頭要向上指,表示這是子類的一部分,指向所繼承的基類。
9.子類可以覆蓋方法來改變或替換它繼承的方法。
有時你可能希望子類繼承基類的大部分行為,但是並非所有行為。如果希望改變乙個繼承的某些行為,可以覆蓋這些方法。
❶為基類中的方法新增virtual關鍵字
子類只能覆蓋標誌由virtual關鍵字的方法,這就告訴c#允許子類覆蓋這些方法。
class bird
}
❷為派生類增加乙個同名的方法
這個方法要有完全相同的方法簽名,這說明返回值和引數都相同,而且要在宣告中使用override關鍵字。
class penguin:bird
}
10.只要能使用基類,就可以使用它的某個子類
對於繼承,最有用的一點就是可以使用子類來取他繼承的基類。
★相關問題:
★1.可以繼承乙個包含入口點的類嗎?
答:可以。入口點肯定是乙個靜態方法,但是這個方法不一定非得放在靜態類中(static關鍵字表示這個類不能例項化,程式一旦執行就可以使用這個類的方法。)
★2.只能沿著類圖上行而不能下行,這是什麼意思?
答:類圖中,如果乙個類在另乙個類的上面,上面的這個類就比下面的類更抽象,更特定或更具體的類從更抽象的類繼承。
▲如果乙個方法需要父類作為引數,則總是可以傳入其子類的例項。
11.子類可以隱藏超類中的方法
如果子類只是增加乙個與超類方法同名的方法,那麼它只是隱藏了超類方法而不是覆蓋這個方法。(隱藏方法用new關鍵字)
12.使用override和virtual關鍵字來繼承行為
吃力乙個擴充套件了乙個基類的子類時,往往希望覆蓋而不是隱藏,如果你想覆蓋乙個基類中的方法,則一定要標誌virtual關鍵字,而且只要希望在子類中覆蓋這個方法就要使用override關鍵字。如果沒有做到這一點,則最終就會無意中隱藏方法。
13.子類可以使用base關鍵字訪問基類
即使子類中覆蓋了基類中的方法或屬性,有時仍可以訪問基類中的這個成員。幸運的是,可以用base關鍵字,利用這個關鍵字就可以訪問基類中的任何方法。
14.如果基類有建構函式,子類也需要有建構函式
如果類有一些帶引數的建構函式,繼承自這個類的所有子類必須呼叫其中某個建構函式。子類的建構函式與基類建構函式可以有不同的引數。
利用繼承,可以很容易的更新修改**。
C 學習之繼承
繼承 解決 的冗餘,實現多型,增加 的可擴充套件性,便於維護。傳遞性 繼承父類便可以使用父類的屬性,方法 不能繼承字段 子類沒有繼承父類的建構函式,只會預設的呼叫父類無參的建構函式 單根性 乙個類只能繼承乙個父類 以下 出現冗餘 public class student public int age...
c 學習之繼承篇(多重繼承之虛繼承)
虛繼承 是物件導向程式設計中的一種技術,是指乙個指定的基類,在繼承體系結構中,將其成員資料例項共享給也從這個基型別直接或間接派生的其它類。形式 在繼承定義中包含了virtual關鍵字的繼承關係,如下圖中,類a就叫做虛基類。虛擬繼承是多重繼承中的菱形繼承所特有的概念。虛擬基類是為解決多重繼承而出現的。...
C 學習之 C 繼承預習
1.單繼承 單繼承是最簡單的繼承方式,其標準的定義方式為 class 子類名 繼承方式 父類名 其中 是繼承符號,左邊是派生類,右邊是源頭的父類。2.多繼承 多繼承 class 子類名 繼承方式1 父類名1 繼承方式2 父類名2 若省略繼承方式,則預設為私有繼承 3.繼承方式 公有繼承 父類成員對其...