子承父業-C#繼承
|
繼承是軟體複用的一種形式。使用繼承可以複用現在類的資料和行為,為其賦予新功能而建立出新類。複用能節約開發的時間,能複用經過實踐檢驗和除錯的高質量程式碼,提高系統的質量。
繼承的定義和使用
在現有類(基類、父類)上建立新類(派生類、子類)的過程稱為繼承。派生類能自動獲得基類的除建構函式和解構函式函式以外的所有成員,可以在派生類中新增新的屬性和方法擴充其功能。
- 通過繼承建立派生類語法格式如下:
<訪問修飾符> 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; //身份證號碼欄位id public 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關鍵字是引用類的當前例項。
如在上段程式中的建構函式中新增this,可以寫成一下形式:public Person(string name,int age,string gender) //有參建構函式 { this._name = name; this._age = age; this._gender = gender; }
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; //身份證號碼欄位id public 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
- 幫忙點個贊吧。哈哈。
相關文章
- 類的繼承_子類繼承父類繼承
- C# 繼承C#繼承
- odoo 繼承(owl繼承、web繼承、view繼承)Odoo繼承WebView
- 原型繼承:子類原型繼承
- 瞭解下C# 繼承C#繼承
- linux 子程式可以繼承父程式正在監聽的埠嗎? 如何子程式關閉了繼承的埠,父程式還能使用這個埠嗎?Linux繼承
- 原型,繼承——原型繼承原型繼承
- 菱形繼承,虛繼承繼承
- 多繼承 與 多重繼承繼承
- python3父類需要繼承object嗎?Python繼承Object
- Javascript繼承2:建立即繼承—-建構函式繼承JavaScript繼承函式
- Javascript繼承4:潔淨的繼承者—-原型式繼承JavaScript繼承原型
- C#如何實現多重繼承C#繼承
- 繼承繼承
- C#介面、抽象類、普通類和繼承(子類與父類)都有其特定的用途和場景C#抽象繼承
- C++中公有繼承、保護繼承、私有繼承的區別C++繼承
- C#類繼承自泛型集合C#繼承泛型
- C#快速入門教程(15)—— 繼承C#繼承
- day23:單繼承&多繼承&菱形繼承&__init__魔術方法繼承
- 10 #### 繼承繼承
- python繼承Python繼承
- python 繼承Python繼承
- 多繼承繼承
- JavaScript繼承JavaScript繼承
- JavaScript 繼承JavaScript繼承
- javascript:繼承JavaScript繼承
- python 基礎之繼承、重寫、多繼承Python繼承
- C#中繼承和多型的研究C#中繼繼承多型
- java關於繼承父類,需要實現父類中的構造方法Java繼承構造方法
- 什麼是繼承?Python繼承的特徵有哪些?繼承Python特徵
- Pyhon的繼承繼承
- 繼承問題繼承
- Java的繼承Java繼承
- TypeScript 介面繼承TypeScript繼承
- PostgreSQL 表繼承SQL繼承
- 繼承那些坑繼承
- js之繼承JS繼承
- 12.16 Java繼承Java繼承