第六章 初始繼承和多態
1.繼承的概念
其實生活中有很多繼承的例子。例如,在馬路上跑的卡車,我們每天都乘坐的公共汽車,它們都是汽車。卡車有自己的特征:有貨艙,有額定載重,行為都是可以拉貨、卸貨。而公共汽車的特征和行為:有客艙,有載客量,行為有報站、停靠站等。但是它們兩個都有汽車的公共特征和行為:有輪胎,可以行駛,可以剎車。他們就是一種繼承關系,卡車和公共汽車都繼承汽車。
2.繼承的好處
比如說現在有兩個類,一個經理類PM,一個程序員的類SE,這兩個類有同樣的字段,姓名、性別、年齡、工號,既然它們有著同樣的字段,我們都知道重復的定義相同的類成員會造成內存中的浪費,那我們就可以定義一個Employee類,作為它們兩個的父類,讓著程序員的類和經理的類繼承於Employee類。(代碼如下)
2.1這是父類的設計模式
//父類
public class Employee
{ //類的無參構造 public Employee() { Console.WriteLine("我是父類無參構造"); } //類的帶參構造 public Employee(string name, int age) { this.Name = name; this.Age = age; } //打招呼的方法 public virtual void SayHi() { Console.WriteLine("大家好,我是{0},今年{1}歲,工號為{2},我的人氣值{3}。", this.Name, this.Age, this.ID); } //類的成員 protected string ID { get; set; } protected int Age { get; set; } protected string Name { get; set; } protected Gender Gender { get; set; }
2.2這是子類的設計模式
//子類
public class PM:Employee { //定義自己的構造,並隱式調用父類的無參構造 public PM(string id, string name, int age, Gender gender, int year) : base() //隱式調用父類的無參構造:base() { base.ID = id; base.Name = name; base.Age = age; base.Gender = gender; this.Year1 = year; } //自己的無參構造 public PM() { } //自己的私有成員 private int Year; protected int Year1 { get { return Year; } set { Year = value; } } //自己打招呼的方法 public override void SayHi() { Console.WriteLine("大家好,我是{0},今年{1}歲,項目管理經驗{2}。", this.Name, this.Age, this.Year1); }
子類後面的PM:Employee就是PM繼承於Employee了,繼承的好處就是減少了代碼的重復性,解決了代碼的冗余問題。註:C#和java都是單繼承語言它們不支持多繼承
被繼承的類被稱為基類或超類,繼承的類被稱為派生類
3.base關鍵字和protected修飾符
base關鍵字與this關鍵字有所不同,base調用的方法都是父類的,this關鍵字是指本類的對象。protected修飾符,簡單的說就是拿protected修飾符所修飾的成員他只能使本類和它的子類訪問,其他類不能訪問,就是說跟父類沒有關系的類不能訪問該成員。(在上面代碼快中也有用到)
4.子類的構造的運行機制
當子類運行構造函數時,它會先去調用父類的構造函數。(子類構造運行圖如下)
public PM(string id, string name, int age, Gender gender, int year) : base() //隱式調用父類的無參構造:base()
子類的構造函數會先調用父類的構造函數,語法就像上面的代碼一樣。
base關鍵字可以調用父類的非私有成員。
5.is a的應用
is關鍵字,這個關鍵字用來判斷對象是否屬於給定的類型。如果屬於就返回true,不屬於返回false。
if(empl is SE)表示判斷對象是否為SE類型。
6.繼承的價值
繼承模擬了顯示生活中的關系,OOP中強調一切皆對象,這符合我們面向對象編程的思考方向。
繼承實現了代碼的重用性,合理的使用繼承,會使代碼更加簡潔。
繼承是得程序結構清晰,子類和父類的層次結構清晰,最終的目的使子類只關註子類的相關行為和狀態,無須關註父類的行為和狀態。例如,學員(Student)只需要管理學號,愛好這種屬性
,而公共的姓名,年齡、性別屬性交給父類(Person)管理。
7.使用virtual關鍵字和override關鍵字實現多態
這張截圖上就是把父類定義好的一個打招呼的方法使用virtual關鍵字修飾代表虛方法的意思。
這個就是子類重寫父類的虛方法了,加上override關鍵字代表要重寫父類的方法。(方法名需要一致)
上面的這個例子就是多態的表現了,如果有多個子類需要完成不同的事情就可以重寫父類的虛方法完成多態的表現。
第六章 初始繼承和多態