子承父業-C#繼承

小邢同學發表於2020-11-05

  • 博主寫作不容易,孩子需要您鼓勵
  • 萬水千山總是情 , 先點個贊行不行

繼承是軟體複用的一種形式。使用繼承可以複用現在類的資料和行為,為其賦予新功能而建立出新類。複用能節約開發的時間,能複用經過實踐檢驗和除錯的高質量程式碼,提高系統的質量。

繼承的定義和使用

在現有類(基類、父類)上建立新類(派生類、子類)的過程稱為繼承。派生類能自動獲得基類的除建構函式和解構函式函式以外的所有成員,可以在派生類中新增新的屬性和方法擴充其功能。

  • 通過繼承建立派生類語法格式如下:
  • <訪問修飾符> 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
    • 幫忙點個贊吧。哈哈。

相關文章