繼承
在現有類(稱為基類、父類)上建立新類(稱為衍生類別、子類)的處理過程為繼承。衍生類別能自動擷取基類(除了建構函式和解構函式外的所有成員),可以在衍生類別中添加新的屬性和方法擴充其功能。
View Code
using System;using System.Collections.Generic;using System.Linq;using System.Web;public class Person{ private string _id; public string id { get { return _id; } set { _id = value; } } /// <summary> /// 建構函式 /// </summary> /// <param name="id"></param> public Person(string id) { _id = id; } /// <summary> /// 無參建構函式 /// </summary> /// <param name="id"></param> /// <param name="Class"></param> public Person() { } public string GetID() { return id; }}//<存取修飾詞>class 衍生類別名:基類名public class Student : Person{ private string _Class; public string Class { get { return _Class; } set { _Class = value; } } /// <summary> /// 無參建構函式 /// </summary> /// <param name="id"></param> /// <param name="Class"></param> public Student() { } public string GetClass() { return Class; }}public class NewStudent:Student{ /// <summary> /// 無參建構函式 /// </summary> /// <param name="id"></param> /// <param name="Class"></param> public NewStudent() { } private string _NID; public string NID; public string GetNID() { return NID; }}View Code
protected void Page_Load(object sender, EventArgs e) { Person p = new Person("ID1111111"); Student s = new Student(); NewStudent n = new NewStudent(); s.id = "ID2222222"; s.Class = "12班"; n.NID = "NID3333333"; n.id = "ID3333333"; n.Class = "13班"; Label1.Text = p.GetID(); Label2.Text = s.GetID()+s.GetClass(); Label3.Text = n.GetID() + s.GetClass() + n.GetNID(); //輸出結果 ID1111111111 ID222222212班 ID333333312班NID3333333 }
從上面的例子可以看出,繼承的可傳遞性,如果C從B中派生,B又從A派生。那麼C不僅繼承了B中的成員,同樣也繼承了A中的成員。繼承的單一性指衍生類別只能從一個基類中繼承,不能同時繼承多個基類。衍生類別只能訪問基類中public,protected,internal修飾的成員
base關鍵字用於在衍生類別調用基類的建構函式、屬性和方法。
public Student(string id):base(id) //調用基類的建構函式 { }
多態的實現(virtual override abstract的使用)
在C#的學習中,容易混淆virtual方法和abstract方法的使用,現在來討論一下二者的區別。二者都牽涉到在衍生類別中與override的配合使用。
1、Virtual方法(虛方法)
virtual 關鍵字用於在基類中修飾方法。virtual的使用會有兩種情況:
情況1:在基類中定義了virtual方法,但在衍生類別中沒有重寫該虛方法。那麼在對衍生類別執行個體的調用中,該虛方法使用的是基類定義的方法。
情況2:在基類中定義了virtual方法,然後在衍生類別中使用override重寫該方法。那麼在對衍生類別執行個體的調用中,該虛方法使用的是派生重寫的方法。
2、Abstract方法(抽象方法)
abstract關鍵字只能用在抽象類別中修飾方法,並且沒有具體的實現。抽象方法的實現必須在衍生類別中使用override關鍵字來實現。
View Code
public abstract class Person{ private string _id; public string id { get { return _id; } set { _id = value; } } /// <summary> /// 建構函式 /// </summary> /// <param name="id"></param> public Person(string id) { _id = id; } /// <summary> /// 無參建構函式 /// </summary> /// <param name="id"></param> /// <param name="Class"></param> public Person() { } public virtual string GetID() { return "虛方法可覆蓋"; } public virtual string GetID1() { return "虛方法可覆蓋"; } public string GetID2() { return "一般的方法,在衍生類別重寫,需要用new"; } public abstract string GetID3(); //抽象方法,不含主體 衍生類別必須繼承此方法}//<存取修飾詞>class 衍生類別名:基類名public class Student : Person{ private string _Class; public string Class { get { return _Class; } set { _Class = value; } } public Student() { } public Student(string id):base(id) //調用基類的建構函式 { } public override string GetID() { return "虛方法可覆蓋-用override"; } public new string GetID2() { return "普通方法可覆蓋-用new"; } public override string GetID3() { return "抽象方法必須實現-用override"; }}View Code
protected void Page_Load(object sender, EventArgs e) { var a = new Student(); Label1.Text = a.GetID() ; Label2.Text = a.GetID1(); Label3.Text = a.GetID2(); Label4.Text = a.GetID3(); //運行結果 //虛方法可覆蓋-用override 虛方法可覆蓋 普通方法可覆蓋-用new 抽象方法必須實現-用override }