前面提到過,物件導向的三大特性:封裝性、繼承性和多態性。封裝在前面類的定義裡也瞭解的差不多透徹了,現在看看繼承的特性。
繼承實際是一個類對另一個類的擴充,後者稱之為基類,前者稱之為子類。繼承就是子類擁有基類的一切屬性和方法,子類還可以增加屬性和方法。但是子類不能去掉父類的屬性和方法。
當然這裡還要提到修飾符的問題,子類擁有基類的所有屬性和方法,不意味著子類可以任意訪問繼承的這些屬性和方法。子類只能訪問到public和protected修飾的屬性和方法,其餘無法直接存取。還有一個就是static的屬性和方法是不能被繼承下來的,因為靜態類型之和類有關係與對象無關。
看代碼:
using System;namespace YYS.CSharpStudy.MainConsole{ public class YSchool { private int id = 0; private string name = string.Empty; public int ID { get { return this.id; } } public string Name { get { return name; } } /// <summary> /// 構造器 /// </summary> public YSchool() { this.id = 0; this.name = @"清華大學附中"; } /// <summary> /// 構造器 /// </summary> public YSchool(int id, string name) { this.id = id; this.name = name; } /// <summary> /// 構造器 /// </summary> public YSchool(int id) { this.id = id; this.name = @"陝師大附中"; } } public class YTeacher { private int id = 0; private string name = string.Empty; private YSchool school = null; private string introDuction = string.Empty; private string imagePath = string.Empty; /// <summary> /// 使用唯讀屬性,因為是固有屬性。 /// </summary> public int ID { get { return id; } } public string Name { get { return name; } } /// <summary> /// 這幾個使用get/set屬性,因為這幾個屬性不是固有的,可以隨著某些條件改變的。 /// </summary> public YSchool School { get { if (school == null) { school = new YSchool(); } return school; } set { school = value; } } public string IntroDuction { get { return introDuction; } set { introDuction = value; } } public string ImagePath { get { return imagePath; } set { imagePath = value; } } public YTeacher(int id, string name) { this.id = id; this.name = name; } /// <summary> /// 給學生講課的方法 /// </summary> public void ToTeachStudents() { Console.WriteLine(string.Format(@"{0} 老師教育同學們: Good Good Study,Day Day Up!", this.name)); } /// <summary> /// 懲罰犯錯誤學生的方法 /// </summary> /// <param name="punishmentContent"></param> public void PunishmentStudents(string punishmentContent) { Console.WriteLine(string.Format(@"{0} 的{1} 老師讓犯錯誤的學生 {2}。", this.School.Name, this.name, punishmentContent)); } } /// <summary> /// 男性老師,繼承自YTeacher /// </summary> public class MrTeacher : YTeacher { /// <summary> /// 構造器,這裡要注意,YTeacher是沒有提供預設構造器的, /// 所以子類必須要有構造器,並且和基類參數列表一致。 /// </summary> /// <param name="id"></param> /// <param name="name"></param> public MrTeacher(int id, string name) : base(id, name) { } /// <summary> /// 擴充的方法,刮鬍子方法。 /// </summary> public void Shave() { Console.WriteLine(string.Format(@"{0} 老師用飛科剃鬚刀刮鬍子。",this.Name)); } } /// <summary> /// 女性老師,繼承自YTeacher /// </summary> public class MisTeacher : YTeacher { /// <summary> /// 建構函式 /// </summary> /// <param name="id"></param> /// <param name="name"></param> public MisTeacher(int id, string name) : base(id, name) { } /// <summary> /// 擴充方法,護膚的方法 /// </summary> public void SkinCare() { Console.WriteLine(string.Format(@"{0} 老師用香奈兒護膚霜護膚。",this.Name)); } }}
using System;namespace YYS.CSharpStudy.MainConsole{ class Program { static void Main(string[] args) { MrTeacher mrTeacher = new MrTeacher(1, @"牛轟轟"); mrTeacher.ToTeachStudents(); mrTeacher.PunishmentStudents(@"背唐詩"); mrTeacher.Shave(); MisTeacher misTeacher = new MisTeacher(2, @"郝漂靚"); misTeacher.ToTeachStudents(); misTeacher.PunishmentStudents(@"默寫紅樓夢"); misTeacher.SkinCare(); Console.ReadKey(); } }
結果:
繼承是物件導向的特性,它的好處是:
第一、做項目設計類時,繼承可以讓我們省略量代碼;
第二、符合物件導向中類的組織形式,在C#、java等進階物件導向語言中,都有一個object類,這是所有類的祖宗類,其他類都有他派生而來。
繼承需要注意一點,就是子類的構造器問題。程式運行過程是子類首先調用父類的構造器。如果子類沒有寫構造器,那麼就會調用父類的預設構造器。如果父類沒有預設的構造器,即父類寫了帶參數的構造器,那麼子類也就調用帶參數的那個構造器,不過需要指明是調用的哪個帶參數的構造器(見代碼中base)。
以上就是C#基礎知識整理:基礎知識(4) 繼承的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!