標籤:
前言:這節課是C#講解的第四節課,主要圍繞物件導向的三大特性展開。上節課已經把封裝講完了,這節課講繼承和多態。
內容:
1.繼承:寫程式的時候有些資訊是公用的,可以將這些公用的資訊寫在父類裡,增強代碼的可複用性。
(1)class A : B,被繼承的類稱為基類或父類或超類,而繼承得到的類稱為子類或衍生類別。子類繼承超類的狀態和行為(欄位和方法),同時也可以具有自己的特徵。父類裡面的私人成員,子類也是繼承了的,只是沒有存取權限,就像不知道密碼的保險箱一樣。
(2)A:B,B:C,則A:C。
(3)任何類型的基類是object類型。
(4)當一個類是密封類(sealed),它是不能被繼承的。
(5)A:B,B裡面有sayHi(),用A的執行個體化對象調用sayHi()的時候,首先調用的是B裡面的構造方法,然後是A的構造方法,最後才是sayHi(),如果B上面還有繼承的類,則先調用該類的構造方法。如:
Animal類:
1 class Animal2 {3 public Animal()4 {5 Console.WriteLine("我是動物,我出生了");6 }7 }
Person類:
1 class Person:Animal 2 { 3 public int age; 4 public string name; 5 6 public Person() 7 { 8 Console.WriteLine("我是人類,我出生了"); 9 }10 public void SayHi()11 {12 Console.WriteLine("大家好,我是人類");13 }14 }
Chinese類:
1 class Chinese:Person2 {3 public Chinese()4 {5 Console.WriteLine("我是中國人,我出生了");6 }7 }
其中:Chinese:Person,Person:Animal。
1 class Program2 {3 static void Main(string[] args)4 {5 Chinese c = new Chinese();6 c.SayHi();7 Console.ReadKey();8 }9 }
運行結果為:
(6)如果子類和父類裡有相同名稱的方法,若子類對象調用該方法,則父類中的同名方法將被隱藏。可使用new修飾同名方法而達到隱藏父類同名方法的目的。
(7)一個父類的方法如果要被子類覆寫,則父類需聲明為virtual類型。子類繼承後使用override修飾該方法。如在父類中:public virtual void SayHi(),在子類中:public override void SayHi()。
(8)裡氏替換原則:子類對象可以賦值給父類對象:Person p = new Chinese(),反之不成立。
(9)如果A:B,A、B裡面都有一個方法叫SayHi(),B b = new A(),當b調用SayHi()時,預設情況下(即沒有被複寫),則採用就近原則,即調用 B的SayHi()。如果SayHi()被覆寫,則調用子類的SayHi()。
2.多態:同一種方法名,但是有不同的實現形式。多態分為重載(overload)和覆寫(override)。
(1)重載:方法名相同,方法裡面的參數個數或者類型不同。
(2)只有父類的虛方法(virtual)才能被子類覆寫,子類覆寫用關鍵字override。如果不加override就隱藏了父類的方法(需加關鍵字new)。
(3)靜態方法不能被覆寫,但可以被隱藏。
(4)靜態類裡面只能有靜態成員。
(5)靜態成員不能帶override,virtual,abstract。
3.抽象類別、抽象方法:abstract + 類名、abstract + 方法名
(1)抽象類別不能被執行個體化。
(2)抽象方法的作用是為子類提供一個統一的介面,抽象方法裡面只有聲明,沒有實現。
(3)一個類一旦繼承了一個抽象類別,就必須實現對該抽象類別裡面所有的抽象方法的實現。
(4)一個抽象類別裡面可以有非抽象方法,但是一旦一個類裡面有抽象方法,該類就為抽象類別了。
(5)抽象方法在聲明後用一個;結束,不需要用{}。
(6)抽象方法在覆寫的時候不需要聲明為虛方法。
1 public abstract class Program 2 { 3 public abstract void A(); 4 public abstract void B(); 5 } 6 public class C : Program 7 { 8 public override void A() 9 {10 Console.WriteLine("China"); 11 }12 public override void B()13 {14 Console.WriteLine("Hello");15 }16 public static void Main()17 {18 C me = new C();19 me.A();20 }21 }
4.介面:Interface + 類名
(1)介面用來實現多繼承,一個類只能有一個父類,但可以繼承多個介面。
(2)介面是一種特殊的抽象類別,它裡面規定得更嚴格,裡面的方法只能為抽象方法。
(3)定義一個介面的時候,一般為預設,即 Interface+類名,前面自動加上了public abstract。定義介面中的方法時,也只需要寫傳回型別 + 方法名即可,也預設為public abstract。
(4)介面裡面的所有成員都是公用的,抽象類別裡面的成員可以是私人的,公用的,受保護的。
(5)一個類繼承於一個介面,就必須完成介面中所有方法的實現。
(6)介面不能包含欄位、建構函式、靜態變數或者常量等。
5.泛型:為避免反覆裝箱拆箱過程,所以引入泛型。它將裝入的資料類型聲明好,只允許此種類型的資料加入。在System.Collections.Generic命名空間中。
非泛型集合類與泛型集合類的對照關係:ArrayList---List<T>;HashTable---Dictionary<T>;Stack---Stack<T>。
後記:課下學習。
ASP.NET動態網站製作(21)-- C#(4)