該隨筆簡單的展示了抽象類和抽象方法的定義和使用,使用繼承體現面向對象"多態"…… ...
父類與子類相互轉換
1 /// <summary> 2 /// 動物類(父類) 3 /// </summary> 4 class Animal 5 { 6 public string Name { get; set; }//名字 7 public string Color { get; set; }//顏色 8 public string Kind { get; set; }//種類 9 public string Favorite { get; set; }//喜好 10 11 public Animal() { } 12 public Animal(string name, string color, string kind) 13 { 14 this.Name = name; 15 this.Color = color; 16 this.Kind = kind; 17 } 18 //自我介紹 19 public void Introduce() 20 { 21 string info = string.Format("我是漂亮的{0},我的名字叫{1},身穿{2}的衣服,我愛吃{3}!", this.Kind, Name, Color, Favorite); 22 Console.WriteLine(info); 23 } 24 }View Code
給Cat和Dog分別添加Have()方法:
1 /// <summary> 2 /// 玩具貓類 3 /// </summary> 4 class Cat:Animal//繼承Animal類 5 { 6 public Cat() { }//預設調用父類的無參構造函數,若此時父類並沒有無參構造函數,則報錯 7 public Cat(string name, string color, string kind, string favorite) : base(name, color, kind) 8 { 9 this.Favorite = favorite; 10 } 11 //跳舞 12 public void Dancing() 13 { 14 base.Introduce();//調用父類的方法 15 Console.WriteLine("下麵給大家表演,請大家鼓掌!"); 16 } 17 18 public void Have() 19 { 20 Console.WriteLine("吃烤魚!"); 21 }View Code
1 /// <summary> 2 /// 玩具狗類 3 /// </summary> 4 class Dog:Animal//繼承Animal類 5 { 6 public Dog(string name, string color, string kind) 7 { 8 this.Name = name;//使用this關鍵字訪問父類成員 9 this.Color = color; 10 this.Kind = kind; 11 } 12 13 public Dog() { }//隱式調用:預設調用父類的無參構造函數,若此時父類並沒有無參構造函數,則出錯。 14 15 public Dog(string name, string color, string kind, string favorite) : base(name, color, kind) 16 {//顯示調用 17 this.Favorite = favorite; 18 } 19 public void Race() 20 { 21 base.Introduce();//使用base關鍵字調用父類方法 22 Console.WriteLine("下麵給大家表演賽跑,請大家鼓掌!"); 23 } 24 25 public override void Have() 26 { 27 Console.WriteLine("吃骨頭!"); 28 } 29 }View Code
調用:
1 static void Main(string[] args) 2 { 3 //創建兩個對象 4 Cat objCat = new Cat("球球", "黃色", "小花貓", "小魚"); 5 Dog objDog = new Dog("團團", "黑色", "小黑狗", "骨頭"); 6 7 //將子類對象添加到父類集合 8 List<Animal> list = new List<Animal>(); 9 10 //List<object> list1 = new List<object>(); 11 //添加時自動將子類轉換為父類類型(父類類型可以添加子類對象,子類自動轉換成父類類型) 12 list.Add(objCat); 13 list.Add(objDog); 14 15 //取出對象(取出時必須判斷屬於哪一個子類對象,父類類型對象必須強制轉換成對應子類對象,才能調用子類方法。) 16 foreach (Animal obj in list) 17 { 18 if (obj is Cat)//判斷原始類型 19 ((Cat)obj).Have(); 20 else 21 ((Dog)obj).Have(); 22 } 23 24 }View Code
從上述代碼示例中我們可以看到,父類類型可以添加子類對象,子類自動轉換成父類類型。而在取出對象時,需要判斷對象的原始類型屬於哪一個對象,然後強制轉換成對應子類對象,才能調用子類的方法。下麵介紹如何使用抽象類和抽象方法優化上述示例代碼。
使用抽象類和抽象方法
在父類中定義一個抽象方法:
1 /// <summary> 2 /// 動物類(父類) 3 /// </summary> 4 abstract class Animal 5 { 6 public string Name { get; set; }//名字 7 public string Color { get; set; }//顏色 8 public string Kind { get; set; }//種類 9 public string Favorite { get; set; }//喜好 10 11 public Animal() { } 12 public Animal(string name, string color, string kind) 13 { 14 this.Name = name; 15 this.Color = color; 16 this.Kind = kind; 17 } 18 //自我介紹 19 public void Introduce() 20 { 21 string info = string.Format("我是漂亮的{0},我的名字叫{1},身穿{2}的衣服,我愛吃{3}!", this.Kind, Name, Color, Favorite); 22 Console.WriteLine(info); 23 } 24 25 /// <summary> 26 /// 定義一個抽象方法 27 /// </summary> 28 public abstract void Have();View Code
在子類中重寫(override)父類未實現的方法(抽象方法):
1 /// <summary> 2 /// 玩具貓類 3 /// </summary> 4 class Cat:Animal//繼承Animal類 5 { 6 public Cat() { }//預設調用父類的無參構造函數,若此時父類並沒有無參構造函數,則報錯 7 public Cat(string name, string color, string kind, string favorite) : base(name, color, kind) 8 { 9 this.Favorite = favorite; 10 } 11 //跳舞 12 public void Dancing() 13 { 14 base.Introduce();//調用父類的方法 15 Console.WriteLine("下麵給大家表演,請大家鼓掌!"); 16 } 17 18 /// <summary> 19 /// 重寫父類的Have()方法 20 /// </summary> 21 public override void Have() 22 { 23 Console.WriteLine("吃烤魚!"); 24 } 25 26 }View Code
1 /// <summary> 2 /// 玩具狗類 3 /// </summary> 4 class Dog:Animal//繼承Animal類 5 { 6 public Dog(string name, string color, string kind) 7 { 8 this.Name = name;//使用this關鍵字訪問父類成員 9 this.Color = color; 10 this.Kind = kind; 11 } 12 13 public Dog() { }//隱式調用:預設調用父類的無參構造函數,若此時父類並沒有無參構造函數,則出錯。 14 15 public Dog(string name, string color, string kind, string favorite) : base(name, color, kind) 16 {//顯示調用 17 this.Favorite = favorite; 18 } 19 public void Race() 20 { 21 base.Introduce();//使用base關鍵字調用父類方法 22 Console.WriteLine("下麵給大家表演賽跑,請大家鼓掌!"); 23 } 24 25 /// <summary> 26 /// 重寫父類的Have()方法 27 /// </summary> 28 public override void Have() 29 { 30 Console.WriteLine("吃骨頭!"); 31 } 32 }View Code
調用:
1 static void Main(string[] args) 2 { 3 //創建兩個對象 4 Cat objCat = new Cat("球球", "黃色", "小花貓", "小魚"); 5 Dog objDog = new Dog("團團", "黑色", "小黑狗", "骨頭"); 6 7 //將子類對象添加到父類集合 8 List<Animal> list = new List<Animal>(); 9 10 //添加時自動將子類轉換為父類類型 11 list.Add(objCat); 12 list.Add(objDog); 13 14 //取出對象 15 foreach (Animal obj in list) 16 { 17 obj.Have();//不再需要類型判斷 18 } 19 20 }View Code
使用抽象類和抽象方法後,我們發現無需對取出對象進行類型判斷,程式也能自動調用對應子類的實現方法(由虛擬機完成)。充分體現了面向對象編程的"多態"思想,使用"繼承多態"機制很好地解決了系統擴展問題。
總結抽象類與抽象方法
抽象類的概念與使用要點:
1.使用關鍵字abstract修飾的類,稱為抽象類。
2.抽象類只是用來列舉一個類所具有的行為,不能單獨通過創建對象來使用,如 Animal animal=new Animal() (×)。
3.抽象類中可以有抽象方法,也可以沒有任何抽象方法。但是有抽象方法的類一定是抽象類。
4.抽象類不能是靜態類(static)或密封類(sealed)。註:密封類不能被重寫。
抽象方法的概念與使用要點:
1.再抽象類中使用abstract修飾的方法,稱之為抽象方法。
2.抽象方法必須再抽象類中定義,不能再普通類中使用(即有抽象方法的類一定是抽象類)。
3.抽象方法只是一個方法的聲明,不能有任何方法體。如:public abstract void Have();
4.抽象方法僅僅表示一個應該具有的行為,具體實現由子類實現。
5.抽象方法再子類中被實現(重寫)必須使用關鍵字override。
6.子類必須重寫父類的所有抽象方法,除非子類本身也是抽象類。