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();
編譯執行後的結果如下: