在前一篇文章中,我們講了面向對象的特征之一(封裝),那么今天我們來了解面向對象的剩余兩大特性。
一、繼承1、定義 繼承就是從父類中獲取一些公開的成員,如方法和屬性。C#中只允許繼承一個父類,但允許繼承多個接口。如果子類繼承接口,則必須實現接口中定義的所有公開成員。 公開成員是指在父類中定義為public的成員(public的作用域可在子類中生效,而PRivate作用域則不可)子類繼承父類:子類擁有父類非Private的屬性和功能;子類具有自己的屬性和功能,即子類可以擴展父類沒有的屬性和功能;子類還可以以自己的方式實現父類的功能(方法重寫)2、繼承的兩大特性:
001.單根性:一個子類不能同時繼承多個父類。
002. 傳遞性:如果有一個類A繼承與類B,又有一個類C繼承與類A,那么類C也可以使用類B中非私有的字段,屬性和方法。
3.子類構造執行流程?
解析:第一步:先進入子類構造參數列表
第二步:進入父類對應的構造
第三步:執行父類構造的方法體
第四步:回到子類方法體執行.
4、優點 繼承使得所有子類公共部分都放在父類中,使得代碼得到共享,這就避免了重復。此外,繼承可使得修改或擴展繼承而來的實現都較為容易。5、注意 Protected表示繼承時子類可以對基類有完全訪問權。也就是說protected修飾的類成員,對子類公開,段不對其他類公開。實例: 1 private void button1_Click(object sender,EventArgs e) 2 3 { 4 5 Cat cat = new Cat("咪咪");//將類實例化 Cat cat聲明一個Cat對象,對象名為cat;newCat()將此cat對象實例化 6 7 cat.ShoutNum = 5; //給屬性賦值 8 9 MessageBox.Show(cat.Shout()); 10 11 } 12 13 class Animal //定義父類 14 15 { 16 17 protected string name =""; //注意變為Protected 子類可以繼承 18 19 public Animal(string name) 20 21 { 22 23 this.name = name; 24 25 26 27 } 28 29 public Animal() 30 31 { 32 33 this.name = "無名"; 34 35 } 36 37 protected int shoutNum = 3; //變為protected 38 39 public int ShoutNum 40 41 { 42 43 get 44 45 { 46 47 return shoutNum; 48 49 } 50 51 set 52 53 { 54 55 shoutNum = value; 56 57 } 58 59 } 60 61 } 62 63 class Cat : Animal //注意變化 64 65 { 66 67 public Cat() : base() //子類構造方法需要調用父類同樣參數類型的構造方法,用base關鍵字代表父類 68 69 { } 70 71 public Cat(string name):base(name) //注意變化 72 73 { } 74 75 public string Shout() 76 77 { 78 79 string result = ""; 80 81 for (int i = 0; i <shoutNum; i++) 82 83 result += "喵!"; 84 85 return "我的名字叫:" +name + "" + result; 86 87 } 88 89 } 90 91 class Dog : Animal //注意變化 92 93 { 94 95 public Dog() : base() 96 97 { } 98 99 public Dog(string name): base(name) 100 101 { } 102 103 public string shout() 104 105 { 106 107 string result = ""; 108 109 for (int i = 0; i <shoutNum; i++) 110 111 result += "汪!"; 112 113 return "我的名字叫:" +name + "" + result; 114 115 } 116 117 } 118 119 private void button2_Click(objectsender, EventArgs e) 120 121 { 122 123 Dog dog = new Dog("狗");//將類實例化 Cat cat聲明一個Cat對象,對象名為cat;newCat()將此cat對象實例化 124 125 dog.ShoutNum = 5; //給屬性賦值 126 127 MessageBox.Show(dog.shout()); 128 129 } 二、多態
1、定義 多態是指類可以有多種形態,通過修改可以形成多個實現方法。子類從父類繼承時它會獲得父類的所有方法、字段、屬性、事件。多態表示不同的對象可以執行相同的操作,但要通過它們自己的實現代碼來執行。通俗的說:不同的對象對于同一個指令做出的響應不同,就是多態。 若要改變父類的數據和行為,兩種方式:可創建新的成員替換父級成員,或者可以重寫虛擬的父級成員。(1)若要替換父級成員,需要使用new關鍵字。下面是GetName方法的兩種形態,一種是返回父級名稱,一種是返回子級名稱?! ?pre> 1 第一種:返回父級名稱 2 3 class PerentClass //父類 4 5 { 6 7 public string GetName() 8 9 { 10 11 return"父級名稱"; 12 13 } 14 15 } 16 17 第二種:返回子級名稱 18 19 class SonClass:PerentClass //子類繼承父類 20 21 { 22 23 public new string GetName() 24 25 { 26 27 return"子級名稱"; 28 29 } 30 31 } 32(2)重寫虛擬的父級成員的兩個條件:父級成員使用關鍵字“virtual”;子級成員使用“override”。
1 class PerentClass //父類 2 3 { 4 5 public virtual string GetName() 6 7 { 8 9 return"父級名稱"; 10 11 } 12 13 } 14 15 16 17 class SonClass:PerentClass //子類繼承父類 18 19 { 20 21 public override string GetName() 22 23 { 24 25 return"子級名稱"; 26 27 } 28 29 }(2):抽象方法實現多態
1 /// <summary> 2 /// 鳥類:基類 3 /// </summary> 4 public abstract class Bird 5 { 6 /// <summary> 7 /// 吃:抽象方法 8 /// </summary> 9 public abstract void Eat();10 } 1 /// <summary> 2 /// 喜鵲:子類 3 /// </summary> 4 public class Magpie:Bird 5 { 6 /// <summary> 7 /// 重寫父類中Eat方法 8 /// </summary> 9 public override void Eat()10 {11 Console.WriteLine("我是一只喜鵲,我喜歡吃蟲子~");12 }13 } 1 /// <summary> 2 /// 老鷹:子類 3 /// </summary> 4 public class Eagle:Bird 5 { 6 /// <summary> 7 /// 重寫父類中Eat方法 8 /// </summary> 9 public override void Eat()10 {11 Console.WriteLine("我是一只老鷹,我喜歡吃肉~");12 }13 } 1 /// <summary> 2 /// 企鵝:子類 3 /// </summary> 4 public class Penguin:Bird 5 { 6 /// <summary> 7 /// 重寫父類中Eat方法 8 /// </summary> 9 public override void Eat()10 {11 Console.WriteLine("我是一只小企鵝,我喜歡吃魚~");12 }13 } 1 static void Main(string[] args) 2 { 3 //創建一個Bird基類數組,添加 Magpie對象,Eagle對象,Penguin對象 4 Bird[] birds = { 5 new Magpie(), 6 new Eagle(), 7 new Penguin() 8 }; 9 //遍歷一下birds數組10 foreach (Bird bird in birds)11 {12 bird.Eat();13 }14 Console.ReadKey();15 }執行結果:

2,抽象類可以被繼承嗎?
可以,不僅可以被普通類繼承,也可以被抽象類繼承
3,抽象方法可以有方法體嗎?
不可以,連花括號都不能有
4,簡述抽象方法和虛方法的區別?
1 //01.定義一個抽象類,用abstract 修飾 2 3 //02.抽象方法不能有方法體,甚至連{}都不能有 4 5 //03.抽象方法只能存在于抽象類中,但是抽象類中可以有非抽象方法 6 7 //04.抽象類不能實例化 8 9 //05.抽象類中抽象方法只是用來規定方法的形式(參數,返回值),約束子類方法的形式10 11 //06.抽象類中的抽象成員必須在子類中全部實現,除非子類也是抽象類12 13 //07.子類實現抽象方法的快捷鍵,Ctrl+.(沒有輸入法情況下 )14 15 //shift+alt+F1016 17 //08.抽象類不能用static修飾:如果是static,抽象就無法被繼承,也就失去了抽象類本身的意義5、注意子類以父類省份出現子類在工作中以自己的方式來實現子類乙父類的身份出現時,子類特有的屬性和方法不可同時使用使用多態時,需了解:虛方法和方法重寫為了使子類的實例完全接替來自父類的成員,父類必須將該成員聲明為虛擬的。這是通過在該成員的返回類型之前添加virtual來實現。子類選擇使用override關鍵字,將父類實現替換為自己的實現,這就是方法重寫。說了這么多,那么我們用一個具體案例實現一下吧!程序效果圖如下:






關鍵代碼如下://父類 public abstract class Vehicle//抽象類 { public string Color { get; set;
新聞熱點
疑難解答