繼承是指一個對象直接使用另一對象的屬性和方法。首先必須明確的一點是:繼承是類與類之間的關係(不能是類和對象)。
那問題又來了,什麼是類,什麼又是對象呢?
類就是對某一類具有某些相同特性的事物的抽象。而對象就是這類事物中具體的某一個事物。
例如電腦就是一個類,而我的這台電腦就是一個對象。
下面通過一段簡單的代碼實現一個有關繼承的例子:
public class Person { public string Name { get; set; } public int Age { get; set; } public void SayHi() { Console.WriteLine("大家好!"); } } public class Student:Person { public string StuNo { get; set; } }
此時student類就有了Person類的屬性和方法和自己特有的屬性。
為什麼要繼承?繼承帶給我們的好處?
1、代碼重用(子類可以繼承父類的公有成員)2、可以實現多態(後面提到)
有關繼承的幾個特性:
1、繼承的單根性(即每個子類只能有一個父類,而一個父類則可以有多個子類)
2、繼承的傳遞性(子類可以繼承父類的父類的共有成員)
3、子類不能繼承父類的建構函式(預設調用父類的無參建構函式)
所有的類都預設繼承object類(如果一個類沒有顯示的繼承一個類,則它預設繼承自object類)
存取修飾詞:
對於類中的成員我們可以使用5種存取修飾詞:
private 當前類中可以訪問,類中成員的預設存取修飾詞。
protected 當前類及子類中可以訪問。
internal 當前程式集內部可以訪問。
protected internal 當前程式集或子類中(相當於兩個存取修飾詞的並集)
public 任何地方,沒有限制
而對於類的存取修飾詞我們只能使用internal和public兩種,預設為internal。
那麼當父類中有帶參建構函式的時候,子類該怎麼用呢?
public class Person { public Person(string name, int age) { this.Name = name; this.Age = age; } public string Name { get; set; } public int Age { get; set; } public void SayHi() { Console.WriteLine("大家好!"); } } public class Student:Person { public Student(string name,int age,string stuNo):base(name,age) { this.StuNo = stuNo; } public string StuNo { get; set; } }
當父類中有聲明了帶參建構函式時,其預設的無參建構函式將被覆蓋,此時子類在實現自己的建構函式就會報錯(因為子類預設調用父類的無參建構函式)。此時可以有兩種解決方案。第一種,在父類中手動添加無參建構函式,這時子類就可以寫自己的建構函式了;第二種,就是上面代碼中用到的,使用base調用父類的建構函式。
由上面可知,建構函式可以重載。那麼當一個類中有多個建構函式時,我們就又可以“偷懶了”。這時我們就需要使用this關鍵字來調用本類的建構函式。
public class Teacher { public Teacher() { } public Teacher(string name) { this.Name = name; } public Teacher(string name, int age) : this(name) { this.Age = age; } public Teacher(string name, int age, string sex) : this(name, age) { this.Sex = sex; } public string Name { get; set; } public int Age { get; set; } public string Sex { get; set; } }
我們都知道子類可以繼承父類的公有成員,那麼子類可以繼承父類的私人成員嗎?
在我們建立子類對象後,父類的私人成員也會被分配記憶體,但是子類對象不能訪問,這失去了繼承的意義。因為繼承的目的就是為了讓子類能夠訪問父類的成員(代碼重用,多態),所以我認為父類私人成員不能被子類繼承。
下面總結幾個有關繼承中經常出現的問題:
1、當在一個項目中引用另一個項目(程式集)之後,卻無法繼承該項目中的類,這是請檢查此類的存取修飾詞是否為internal。
2、關於訪問性約束的問題。
子類在繼承父類之後,子類的存取修飾詞不能比父類存取修飾詞高(可能會暴露父類的成員,使其一些特權公開)
類似的情況還有:
(1)類中屬性的存取層級不能比該屬性的類型的存取層級高。
(2)方法的存取層級不能比方法的參數和傳回值的類型高。
方便記憶的一句話:"老子"去不了的場合,"兒子"也不能去
OK,有關繼承,就先說到這吧。有錯誤或是理解不到位的地方,還望大家給予批評指正。