子承父业-C#继承
文章目錄
- 繼承的定義和使用
- 實例
- 繼承的特性
- 繼承的可傳遞性
- 繼承的單一性
- 繼承中的訪問修飾符
- base和this關鍵字
- base
- this
- 實例
|
繼承是軟件復用的一種形式。使用繼承可以復用現在類的數據和行為,為其賦予新功能而創建出新類。復用能節約開發的時間,能復用經過實踐檢驗和調試的高質量代碼,提高系統的質量。
繼承的定義和使用
在現有類(基類、父類)上建立新類(派生類、子類)的過程稱為繼承。派生類能自動獲得基類的除構造函數和析構函數函數以外的所有成員,可以在派生類中添加新的屬性和方法拓展其功能。
- 通過繼承創建派生類語法格式如下:
- <訪問修飾符> class 派生類名:基類名{//類的代碼}
在實際中,一個類的對象也是類外一個類的對象。例如,一個矩形類屬于四邊形。也可以說矩形是從四邊形類繼承而來的。四邊形類是基類,矩形類是派生類。再如,教師類和學生類都可以從人這個來派生,講師和教授可以從教師類派生,研究生和本科生可以從學生類派生而得到。
實例
定義基類Person,然后通過繼承創建派生類Student。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace test {class Program{static void Main(string[] args){Person person1 = new Person("小明", 18, "男");person1.DisPlay();Student Stu1 = new Student();Stu1.Name = "小王";Stu1.Age = 19;Stu1.Gender = "男";Stu1.Class = "2014級機械工程專業";Stu1.DisPlay();Stu1.Study();Console.ReadKey();}}public class Person{private String _id; //身份證號碼字段idpublic string ID //身份證號碼屬性id{get { return _id; }set { _id = value; }}private String _name; //姓名字段public string Name //姓名屬性{get { return _name; }set { _name = value; }}private int _age; //年齡字段public int Age //年齡屬性{get { return _age; }set { _age = value; }}private String _gender; //性別字段public string Gender //性別屬性{get { return _gender; }set { _gender = value; }}public Person() //無參構造函數{ }public Person(string name,int age,string gender) //有參構造函數{_name = name;_age = age;_gender = gender;}public void DisPlay() //基類共用方法,顯示人的信息{Console.WriteLine("{0}是{1}性,年齡為{2}歲",this._name,this._gender,this._age);}}public class Student :Person //創建派生類,派生自person類{//定義派生類自己的屬性private String _class; //學生班級public string Class{get { return _class; }set { _class = value; }}private String _department; //學生院系public string Department{get { return _department; }set { _department = value; }}private String _no; //學生學號public string No{get { return _no; }set { _no = value; }}public Student() // 無參構造函數{ }//定義派生類獨有方法Study,表示在校學習public void Study(){Console.WriteLine("學生在校學習");}}}運行結果:
繼承的特性
繼承的可傳遞性
如果C從B派生,B又從A派生,那么C不僅繼承B中聲明的成員,同樣也繼承了A中的成員。
派生類是基類的拓展,在哦愛生類中可以添加新成員,但是不能去除已經繼承的成員。繼承的單一性
繼承的單一性是指派生類只能從一個基類中繼承,不能同時繼承多個基類。C#不支持多重繼承。多重繼承可以通過接口實現。
繼承中的訪問修飾符
在前面的帖子已經講到,C#中的訪問修飾符有:public、protected、private、internal和protected internal5種,可以使用這些訪問修飾符指定5個可訪問級別。
在繼承時各個訪問修飾符的訪問權限如下:訪問性修飾符類內部派生類 public 訪問不受限制 不受限制 protected 訪問僅限于包含類或從包含類派生的類型 可以訪問 internal 訪問僅限于當前項目 可以訪問 protected internal 訪問僅限于從包含類派生的當前項目或類型 可以訪問 private 訪問僅限于包含類 不可訪問 基類中的成員如果用public修飾,任何類都可以訪問;如果用private修飾,他講作為私有成員,只有類本身可以訪問,其他任何類都無法訪問。在C#中,我們是用protected修飾符,使用這個訪問修飾符的成員可以被其派生類訪問,而不允許其他非派生類訪問。
base和this關鍵字
base
從上面的介紹我們知道,基類中只有被public、protected、internal修飾的成員才能被訪問,這些成員包括任何基類的字段、屬性、方法和索引器,但是基類的構造函數和析構函數是不能繼承的。如果要繼承基類的構造函數,必須使用base關鍵字來實現。在C#中的base關鍵字代表基類,使用base關鍵字可以調用基類的構造函數、屬性和方法。
- 使用base關鍵字調用基類構造函數的語法如下:
- public Student(string name,int age,string gender): base(name, age, gender){//通過base(name, age, gender)調用基類的構造函數}
- 使用base關鍵字調用基類方法的語法如下:
- base:基類方法();
this
相對于base來說,this關鍵字是引用類的當前實例。
public Person(string name,int age,string gender) //有參構造函數{this._name = name;this._age = age;this._gender = gender;}
如在上段程序中的構造函數中添加this,可以寫成一下形式:this關鍵字引用類的當前實例,還可以用做拓展方法的第一個參數的修飾符,this關鍵字還可以調用自己的構造方法。使用this關鍵字可以使代碼的編寫簡單化,不容易出錯。在類的方法里使用this關鍵字,在后面輸入一個“.”符號后,系統會把本類所能調用的非靜態方法和變量都顯示出來供選擇,這樣可以提高編碼效率。
派生類繼承基類的屬性方法,從而使創建派生類變得簡單,可以實現代碼的重用。繼承還有一個重要的特性,即基類對象可以引用派生類對象,也就是派生類對象可以賦值給基類對象變量。
實例
使用base和this改進上面的程序
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace test {class Program{static void Main(string[] args){Person person1 = new Person("小明", 18, "男");//利用有參構造函數創建對象person1.DisPlay(); //調用DisPlay方法顯示信息Student Stu1 = new Student("小美",19,"女"); //利用有參構造函數創建對象Stu1.Class = "2014級護理專業";Stu1.DisPlay(); //調用基類DisPlay方法顯示信息Stu1.Study();Person person2 = new Person(); //創建person類對象person2 = Stu1; //把派生類對象賦值給基類對象person2.DisPlay(); //調用DisPlay方法顯示信息((Student)person2).Study(); //基類對象調用派生類的方法Console.ReadKey();}}public class Person{private String _id; //身份證號碼字段idpublic string ID //身份證號碼屬性id{get { return this._id; }set { this._id = value; }}private String _name; //姓名字段public string Name //姓名屬性{get { return this._name; }set { this._name = value; }}private int _age; //年齡字段public int Age //年齡屬性{get { return this._age; }set { this._age = value; }}private String _gender; //性別字段public string Gender //性別屬性{get { return this._gender; }set { this._gender = value; }}public Person() //無參構造函數{ }public Person(string name,int age,string gender) //有參構造函數{this._name = name;this._age = age;this._gender = gender;}public void DisPlay() //基類共用方法,顯示人的信息{Console.WriteLine("{0}是{1}性,年齡為{2}歲",this._name,this._gender,this._age);}}public class Student :Person //創建派生類,派生自person類{//定義派生類自己的屬性private String _class; //學生班級public string Class{get { return _class; }set { _class = value; }}private String _department; //學生院系public string Department{get { return _department; }set { _department = value; }}private String _no; //學生學號public string No{get { return _no; }set { _no = value; }}public Student() // 無參構造函數{ }public Student(string name,int age,string gender):base(name,age,gender){ // 調用基類的構造函數}//定義派生類獨有方法Study,表示在校學習public void Study(){Console.WriteLine("學生在校學習");}}}運行結果:
------------------------------------------------------------------------------------------分割線 ------------------------------------------------------------------------------------------
- 博主簡介:
- 工業自動化上位機軟件工程師、機器視覺算法工程師、運動控制算法工程師。目前從業于智能制造自動化行業。 博主郵箱:2296776525@qq.com
- 幫忙點個贊吧。哈哈。
總結
- 上一篇: Vijos——T 1629 八
- 下一篇: 线程安全的单例模式