C# OOP技術(shù) 繼承
繼承是OOP最重要的特性之一。任何類(lèi)都可以從另一個(gè)類(lèi)繼承,這就是說(shuō),這個(gè)類(lèi)擁有它繼承的類(lèi)的所有成員。在OOP中,被繼承(也稱(chēng)為派生)的類(lèi)稱(chēng)為父類(lèi)(也稱(chēng)為基類(lèi))。注意,C#中的對(duì)象僅能直接派生于一個(gè)基類(lèi),當(dāng)然基類(lèi)也可以有自己的基類(lèi)。
繼承性可從一個(gè)較一般的基類(lèi)擴(kuò)展或創(chuàng)建更多的特定類(lèi)。例如,考慮一個(gè)代表農(nóng)場(chǎng)家畜的類(lèi)(由80多歲的 資深開(kāi)發(fā)人員MacDonald在他的家畜應(yīng)用程序中使用)。這個(gè)類(lèi)名為Animal,擁有EatFood()或Breed()等方法,我們可以創(chuàng)建一個(gè)派生類(lèi)Cow; Cow支持所有這些方法,也有自己的方法,如Moo()和SupplyMilk()。還可以創(chuàng)建另一個(gè)派生類(lèi)Chicken,該類(lèi)有Quck()和LayEgg()方法。
在UML中,用箭頭表示繼承,如圖所示。
Animal | |||
+EatFood() +Breed() | |||
I | i | ||
Chicken | Cow | ||
+Cluck() +LayEgg() | +Moo() +SupplyMilk() |
在繼承一個(gè)基類(lèi)時(shí),成員的可訪問(wèn)性就成了一個(gè)重要問(wèn)題。派生類(lèi)不能訪問(wèn)基類(lèi)的私有成員,但可以訪問(wèn)其公共成員。不過(guò),派生類(lèi)和外部的代碼都可以訪問(wèn)公共成員。這就是說(shuō),只使用這兩個(gè)級(jí)別的可訪問(wèn)性,不能讓一個(gè)成員可由基類(lèi)和派生類(lèi)訪問(wèn),而不能由外部的代碼訪問(wèn)。
為解決這個(gè)問(wèn)題,C#提供了第三種可訪問(wèn)性:protected,只有派生類(lèi)才能訪問(wèn)protected成員。對(duì)于外部代碼來(lái)說(shuō),這個(gè)可訪問(wèn)性與私有成員一樣:外部代碼不能訪問(wèn)private成員和protected成員。
除了定義成員的保護(hù)級(jí)別外,我們還可以為成員定義其繼承行為?;?lèi)的成員可以是虛擬的,也就是說(shuō),成員可以由繼承它的類(lèi)重寫(xiě)。派生類(lèi)可以提供成員的另一種實(shí)現(xiàn)代碼。這種實(shí)現(xiàn)代碼不會(huì)刪除原來(lái)的代碼,仍可以在類(lèi)中訪問(wèn)原來(lái)的代碼,但外部代碼不能訪問(wèn)它們。如果沒(méi)有提供其他實(shí)現(xiàn)方式,通過(guò)派生類(lèi)使用成員的外部代碼就自動(dòng)訪問(wèn)基類(lèi)中成員的實(shí)現(xiàn)代碼。
點(diǎn)擊加載更多評(píng)論>>