c 學習之 繼承

2021-08-04 21:28:17 字數 3112 閱讀 2066

在現有類(稱為基類、父類)上建立新類(稱為派生類、子類)的處理過程稱為繼承。通俗來講就是從父輩身上繼承點特徵。派生類能自動獲取基類(除了建構函式和析構函式(私有成員)的所有成員),可以在派生類中新增新的屬性和方法擴充套件其功能。

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.繼承方式 公有繼承 父類成員對其...