8.2.2继承 第8章 面向对象编程简介
繼承是OOP最重要的特性之一。 ?OOP--面向對象
任何類都可以從另一個類中繼承,這就是說,這個類擁有它繼承的類的所有成員。在OOP中,被繼承(繼承也稱為派生)的類稱為父類(也稱為基類)。注意,C#中的對象僅能直接派生于一個基類,當然基類也可以由自己的基類。
繼承性可以從一個較一般的基類擴展或創建更多的特定類。例如,考慮一個代表農場家畜的類。這個類叫做Animal,擁有方法如EatFood()或Breed(),我們可以創建一個派生類Cow,支持所有這些方法,它也有自己的方法,如Moo()和SupplyMilk()。還可以創建另外一個派生類Chicken,該類有Cluck()和LayEgg()方法。
在繼承一個基類時,成員的可訪問性就成了一個重要問題。派生類不能訪問基類的私有成員,但可以訪問其公共成員。不過,派生類和外部的代碼都可以訪問公共成員。這就是說,只使用這兩個可訪問性,不能讓一個成員只讓基類和派生類訪問,而不能由外部代碼訪問。
為了解決這個問題,C#提供了第三種可訪問性protected,只有派生類才可以訪問protected成員。對外部代碼來說,這個可訪問性與私有成員一樣:外部代碼不能訪問private成員和protected成員。
除了定義成員的保護級別外,我們還可以為成員定義其繼承行為。基類的成員可以是virtual的,也就是說,成員可以由繼承它的類重寫。派生類可以提供成員的其他執行代碼。這種執行代碼不會刪除原來的代碼,仍可以在類中訪問原來的代碼,但是外部不能訪問它們。如果沒有提供其他執行方式,外部代碼就可以訪問基類中成員的執行代碼。
注意:虛擬成員不能是私有成員,因為這樣會自相矛盾——不能說成員可以由派生類重寫,同時派生類又不能訪問它。
?
在前面的家畜示例中,可以把EatFood變成虛擬成員,在派生類中為它提供新的執行代碼,例如為Cow類提供新執行代碼,如下圖所示。
這里顯示了Animal和Cow類的EatFood()方法,說明它們有自己的執行代碼。
?
?
基類還可以定義為抽象類,抽象類不能直接實例化。要使用抽象類,必須繼承這個類,抽象類可以有抽象成員,這些成員在基類中沒有指定代碼,這些執行代碼必須在派生類中提供。
如果Animal是一個抽象類,UML圖就會如下圖所示
注意:抽象類以斜體名稱顯示(有時它們的方框是虛線)
上圖中EatFood()和Breed()都顯示在派生類Chicken和Cow中。
有兩種可能:
1.說明這些方法是抽象的(必須在派生類中重寫)
abstract class Animal{public abstract void EadFood();//抽象方法,不可以有{}主體public abstract void Breed();}class Cow : Animal{public void Moo() { }public void SupplyMilk() { }public override void EadFood() { }//抽象方法在子類中必須實現public override void Breed() { }}class Chicken : Animal{public void Cluck() { }public void LayEgg() { }public override void EadFood() { }public override void Breed() { }}2.說明這些方法是虛擬的(已緊在Chicken和Cow中重寫)
abstract class Animal{public virtual void EadFood() { }//虛擬方法,必須有{}實體public virtual void Breed() { }} class Cow : Animal{public void Moo() { }public void SupplyMilk() { }public override void EadFood() { }//虛擬方法在子類中可以實現,也可以不實現public override void Breed() { }} class Chicken : Animal{public void Cluck() { }public void LayEgg() { }public override void EadFood() { }public override void Breed() { }}?
當然,抽象基類可以提供成員的實現代碼,這是很常見的。不能實例化抽象類,意味著不能再抽象類中封裝功能。
?
最后,類可以是密封的sealed。密封的類不能用作基類,所以沒有派生類。
在C#中,所有的對象都有一個共同的基類object(在.Net Framework中,其別名是System.Object)。第9章中將詳細介紹這個類。
注意:如本章前面所述,接口也可以繼承自其他接口。與類不同的是,接口可以繼承多個基接口(以類可以支持多個接口的方式派生)
轉載于:https://www.cnblogs.com/chucklu/p/4063712.html
總結
以上是生活随笔為你收集整理的8.2.2继承 第8章 面向对象编程简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Asp.Net服务器控件开发的Grid实
- 下一篇: 测试的艺术:测试用例的设计