1. 程式人生 > >C#每日一課(十七)

C#每日一課(十七)

C# 繼承

繼承,它允許根據一個類來定義另一個類,這樣使得建立和維護程式變得相對容易,同樣也有利於程式碼的重用。

在建立一個類時,不需要完全重新編寫新的資料成員和成員函式,只需要設計一個新類,這個新類繼承已有類即可。這個已有類叫做基類,新生成的類叫做派生類。

繼承的思想是實現了屬於(is-a)的關係。

 

基類和派生類

一個派生類只能有一個直接基類,但一個基類可以有多個直接派生類。

繼承是可以傳遞的,定義要從其他類派生的類時,派生類會隱式獲得基類的所有成員(這些成員不包含建構函式和解構函式)。派生類因而可以重用基類中的程式碼,而無需重新實現。在派生類中,可以再自行去新增更多成員,這樣派生類就擴充套件了基類的功能。

C#建立派生類的語法:

<access_specifier> class <base_class>

{

……

}

class <derived_class>:<base_class>

{

……

}

使用Visual Studio新建專案:chapter12_001

新建一個Person類:

class Person

    {

        protected long id;  //身份ID

        protected string name;  //姓名



        public void setId(long id)

        {

            this.id = id;

        }



        public void setName(string name)

        {

            this.name = name;

        }

 }

新建一個Student類,這個類從Person類繼承而來

class Student:Person

    {

        public void Display()

        {

            Console.WriteLine("ID:{0};name:{1}",id,name);

        }

}

在有IDE生成的類中的Main方法中新增如下程式碼

Student stu = new Student();

      stu.setId(100001);

      stu.setName("xiesheng");



      stu.Display();

  Console.ReadKey();

編譯執行後的結果如下:

 

基類的初始化:

派生類新繼承了基類的成員變數和成員方法。因此父類物件應在子類物件建立之前被建立。可以在成員初始化列表中進行父類的初始化。

在Person類中新增建構函式:

//Perosn建構函式

    public Person(long id, string name)

    {

        this.id = id;

        this.name = name;

}

在子類中需要使用初始化列表來進麼初始化,Student類改造後如下

class Student:Person

    {

        private string school;

        public Student(long id, string name, string school) : base(id, name)

        {

            this.school = school;

        }

        public void Display()

        {

            Console.WriteLine("ID:{0};name:{1};school:{2}",id,name,school);

        }

 }

IDE生成類中的Main方法改造為如下:

Student stu = new Student(100001, "xiesheng","西安交通大學");

           

    stu.Display();

Console.ReadKey();

編譯執行後的結果如下:

 

C#中多重繼承:

C#不支援多重繼承,但是,可以通過使用介面來實現多重繼承。

在工程中新增介面interface

interface exam

{

     string getGrade(double en,double hn,double po);

}

Student繼承這個介面,則需要對介面中的方法進行實現

改造Student類如下:

class Student:Person,exam

    {

        private string school;

        private string grade;

        public Student(long id, string name, string school) : base(id, name)

        {

            this.school = school;

        }

        public void  steGrad(string grade)

        {

            this.grade = grade;

        }

        public void Display()

        {

            Console.WriteLine("ID:{0};name:{1};school:{2}",id,name,school);

            Console.WriteLine("考試結果:{0}", grade);

        }



        //對介面實現

        public string getGrade(double en, double hn, double po)

        {

            if (en < 60 || hn < 60 || po < 60)

            {

                return "Fail";

            }

            else

            {

                return "Pass";

            }

        }

   }

在IDE生成的Main方法做如下測試呼叫:

Student stu = new Student(100001, "xiesheng","西安交通大學");

    stu.steGrad(stu.getGrade(60.1, 90.5, 60.0));

    stu.Display();

Console.ReadKey();

編譯執行後的結果如下: