第六章:继承和多态
一:本章目標(biāo)
①:理解繼承的概念
②:使用繼承建立父類(lèi)和子類(lèi)以及繼承的傳遞性、單根性
③:訪(fǎng)問(wèn)修飾符
④:多態(tài)的概念
⑤:會(huì)使用虛方法實(shí)現(xiàn)多態(tài)
?
二:所謂繼承:
在C#中,如果一個(gè)類(lèi)后面通過(guò)冒號(hào)又跟了另外一個(gè)類(lèi),那么我們就稱(chēng)冒號(hào)前面的類(lèi)為子類(lèi),冒號(hào)后面的類(lèi)為父類(lèi)。這種書(shū)寫(xiě)類(lèi)的方式放映出來(lái)的關(guān)系就稱(chēng)為類(lèi)的繼承關(guān)系。
?
1、子類(lèi):派生類(lèi)
父類(lèi):基類(lèi)或者超類(lèi)
2、滿(mǎn)足什么條件的類(lèi)可以使用繼承??
滿(mǎn)足is a關(guān)系的兩個(gè)類(lèi)可以使用繼承。
例如:
?
? ? ?經(jīng)理is a a?員工
?
?????程序員 ?is a?員工
?
?????學(xué)生?is ?a Person
?
繼承的優(yōu)點(diǎn):減少代碼冗余,實(shí)現(xiàn)代碼復(fù)用
?
☆繼承模式下子類(lèi)構(gòu)造,背后到底發(fā)生了什么???
eg:
創(chuàng)建出Animal(父類(lèi))、Dog(子類(lèi))
關(guān)鍵代碼如下:
父類(lèi):
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace Chap06 {public class Animal{//定義自動(dòng)屬性 年齡和姓名public int Age { get; set; }public string Name { get; set; }//無(wú)參構(gòu)造public Animal(){ }//帶參構(gòu)造public Animal(int age,string name){this.Age = age;this.Name = name;}} }子類(lèi):
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace Chap06 {public class Dog:Animal{public string Color{ get; set; }//無(wú)參構(gòu)造public Dog(){ }//帶參構(gòu)造public Dog(int age,string name,string color){this.Age = age;this.Name = name;this.Color = color;}public void Eat(){Console.WriteLine("Dog Eat Meat Very Happy!");}} }Main方法:
namespace Chap06 {class Program{static void Main(string[] args){//創(chuàng)建Dog對(duì)象Dog dog = new Dog();//調(diào)用子類(lèi)中的Eat()方法dog.Eat();Console.ReadKey();}} }解析:
如果我們想構(gòu)建一個(gè)子類(lèi)對(duì)象...
1、進(jìn)入子類(lèi)構(gòu)造方法名,但不進(jìn)入子類(lèi)構(gòu)造的方法體
2、跳轉(zhuǎn)到父類(lèi)構(gòu)造方法名,接下來(lái)執(zhí)行父類(lèi)構(gòu)造的方法體
3、父類(lèi)方法體執(zhí)行完畢,跳轉(zhuǎn)到子類(lèi)方法體執(zhí)行
4、子類(lèi)方法體執(zhí)行完畢,跳轉(zhuǎn)到Main函數(shù),代表子類(lèi)對(duì)象創(chuàng)建過(guò)程
?
?
注:繼承關(guān)系在類(lèi)圖中表示為一個(gè)箭頭,箭頭指向的是父類(lèi)。
子類(lèi)可以繼承父類(lèi)的非私有成員
一個(gè)子類(lèi)只能有一個(gè)直接父類(lèi)
子類(lèi)構(gòu)造默認(rèn)會(huì)調(diào)用父類(lèi)的無(wú)參構(gòu)造
三:base關(guān)鍵字
解析:
①:父類(lèi)的實(shí)例
②:看成是調(diào)用父類(lèi)的構(gòu)造,只出現(xiàn)在子類(lèi)構(gòu)造后面
③:base(參數(shù)列表)父類(lèi)帶參構(gòu)造的參數(shù)列表一致
④:相當(dāng)于方法調(diào)用,不帶有數(shù)據(jù)類(lèi)型
?
四:訪(fǎng)問(wèn)修飾符
①:Public:任何位置都能訪(fǎng)問(wèn)(方法,成員變量,類(lèi))
②:Private:只能當(dāng)前類(lèi)自身訪(fǎng)問(wèn),出了類(lèi)所在{}無(wú)法訪(fǎng)問(wèn)(方法,成員變量)
③:Protected:當(dāng)前類(lèi)和子類(lèi)能訪(fǎng)問(wèn)及子類(lèi)的子類(lèi)(孫子類(lèi))(方法以及變量)
④:Internal:只能在當(dāng)前程序集中使用
三種訪(fǎng)問(wèn)修飾符對(duì)類(lèi)成員的訪(fǎng)問(wèn)限制強(qiáng)度:Private>Protected>Public
五:繼承的特性:
①:傳遞性:
如果一個(gè)類(lèi)B繼承自類(lèi)A,而類(lèi)C又繼承類(lèi)B,那么類(lèi)C也可以訪(fǎng)問(wèn)到類(lèi)A中非私有成員
?
②:單根性(C#不支持多繼承?Java也不支持多繼承)
?
?
六:繼承的價(jià)值
01.模擬現(xiàn)實(shí)世界的關(guān)系
02.便于重用和擴(kuò)展已徹底測(cè)試的代碼,且無(wú)需修改
03.結(jié)構(gòu)更清晰
七:實(shí)現(xiàn)多態(tài)
概念:
不同的對(duì)象對(duì)于同一個(gè)操作,做出的響應(yīng)不同,那么這種情況在面向?qū)ο缶幊讨芯头Q(chēng)為多態(tài)。
使用多態(tài)的目的:
使用多態(tài)就是為了統(tǒng)一調(diào)用。
實(shí)現(xiàn)多態(tài)的方式:
①:通過(guò)虛方法:
實(shí)現(xiàn)多態(tài)的步驟:
01.在父類(lèi)中通過(guò)virtual關(guān)鍵字定義一個(gè)虛方法
02.在子類(lèi)中通過(guò)override關(guān)鍵字對(duì)父類(lèi)中的虛方法進(jìn)行重寫(xiě)
03.調(diào)用的時(shí)候,調(diào)用的是子類(lèi)的方法
?
Main方法進(jìn)行創(chuàng)建對(duì)象以及遍歷集合:
namespace Chap06多態(tài) {class Program{static void Main(string[] args){Chinese chinese = new Chinese();American american = new American();Korea korea = new Korea();Person[] p ={chinese,american,korea};//遍歷集合中的元素,調(diào)用對(duì)應(yīng)子類(lèi)中的Hello方法foreach (Person item in p){item.Hello();}Console.ReadLine();}}?
轉(zhuǎn)載于:https://www.cnblogs.com/hr1997/p/5378012.html
總結(jié)
- 上一篇: TextKit简单示例
- 下一篇: 组合查询(机房重构知识点总结)