成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

不同角度看C#多態(tài)

開發(fā) 后端
本文介紹了C#多態(tài)的三個問題,即一個簡單的C#多態(tài)實現(xiàn),如果繼承中使用new而不是override關(guān)鍵字,多重繼承。

封裝、繼承、多態(tài),面向?qū)ο蟮娜筇匦裕皟身椑斫庀鄬θ菀祝斫舛鄳B(tài),特別是深入的了解,對于初學(xué)者而言可能就會有一定困難了。我一直認為學(xué)習(xí)OO的最好方法就是結(jié)合實踐,封裝、繼承在實際工作中的應(yīng)用隨處可見,但C#多態(tài)呢?也許未必,可能不經(jīng)意間用到也不會把它跟“多態(tài)”這個詞對應(yīng)起來。在此拋磚引玉,大家討論,個人能力有限,不足之處還請指正。

之前看到過類似的問題:如果面試時主考官要求你用一句話來描述多態(tài),盡可能的精煉,你會怎么回答?當然答案有很多,每個人的理解和表達不盡相同,但我比較趨向這樣描述:通過繼承實現(xiàn)的不同對象調(diào)用相同的方法,表現(xiàn)出不同的行為,稱之為多態(tài)。

1、一個簡單的C#多態(tài)實現(xiàn)(參考自http://www.cnblogs.com/glacierh/):

  1. public class Animal  
  2. {  
  3.     public virtual void Eat()  
  4.     {  
  5.         Console.WriteLine("Animal Eat ...");  
  6.     }  
  7. }  
  8.  
  9. public class Cat : Animal  
  10. {  
  11.     public override void Eat()  
  12.     {  
  13.         Console.WriteLine("Cat Eat ...");  
  14.     }  
  15. }  
  16.  
  17. public class Dog : Animal  
  18. {  
  19.     public override void Eat()  
  20.     {  
  21.         Console.WriteLine("Dog Eat ...");  
  22.     }  
  23. }  
  24.  
  25. class Program  
  26. {  
  27.     static void Main(string[] args)  
  28.     {  
  29.         Animal[] animals = new Animal[3];  
  30.  
  31.         animals[0] = new Animal();  
  32.         animals[1] = new Cat();  
  33.         animals[2] = new Dog();  
  34.  
  35.         for (int i = 0; i <  3; i++)  
  36.         {  
  37.             animals[i].Eat();  
  38.         }  
  39.     }  

輸出結(jié)果:

Animal Eat ...

Cat Eat ...

Dog Eat ...

OK,從上面的例子可以看出,通過繼承,使得Animal對象數(shù)組中的不同的對象,在調(diào)用Eat()方法時,表現(xiàn)出了不同的行為,這就是一個最簡單的多態(tài)示例。

2、如果繼承中使用new而不是override關(guān)鍵字

  1. public class Animal  
  2. {  
  3.     public virtual void Eat()  
  4.     {  
  5.         Console.WriteLine("Animal Eat ...");  
  6.     }  
  7. }  
  8.  
  9. public class Cat : Animal  
  10. {  
  11.     public override void Eat()  
  12.     {  
  13.         Console.WriteLine("Cat Eat ...");  
  14.     }  
  15. }  
  16.  
  17. public class Dog : Animal  
  18. {  
  19.     //注意此處用了 new 而不再是 override 關(guān)鍵字  
  20.     public new void Eat()  
  21.     {  
  22.         Console.WriteLine("Dog Eat ...");  
  23.     }  
  24. }  
  25.  
  26. class Program  
  27. {  
  28.     static void Main(string[] args)  
  29.     {  
  30.         Animal animal = new Animal();  
  31.         animal.Eat();  
  32.  
  33.         Animal cat = new Cat();  
  34.         cat.Eat();  
  35.  
  36.         Animal dog = new Dog();  
  37.         dog.Eat();  
  38.     }  

輸出結(jié)果:

Animal Eat ...

Cat Eat ...

Animal Eat ...

從結(jié)果中可以看出,當派生類Dog的Eat()方法使用new修飾時,Dog的對象轉(zhuǎn)換為Animal對象后,調(diào)用的是Animal類中的Eat()方法。其實可以理解為,使用new關(guān)鍵字后,使得Dog中的Eat()方法和Animal中的Eat()方法成為毫不相關(guān)的兩個方法,只是它們的名字碰巧相同而已。也由此可以看出:多態(tài),依賴override實現(xiàn)。

3、多重繼承

如果class A有一個virtual method(),class B繼承于class A,并override method(),class C又繼承于class B,那么class C是否可以繼續(xù)override method()并實現(xiàn)多態(tài)呢?看下面的例子:

  1. public class Animal  
  2. {  
  3.     public virtual void Eat()  
  4.     {  
  5.         Console.WriteLine("Animal Eat ");  
  6.     }  
  7. }  
  8.  
  9. public class Dog : Animal  
  10. {  
  11.     public override void Eat()  
  12.     {  
  13.         Console.WriteLine("Dog Eat ");  
  14.     }  
  15. }  
  16.  
  17. public class WolfDog : Dog  
  18. {  
  19.     public override void Eat()  
  20.     {  
  21.         Console.WriteLine("WolfDog Eat ");  
  22.     }  
  23. }  
  24.  
  25. class Program  
  26. {  
  27.     static void Main(string[] args)  
  28.     {  
  29.         Animal animal = new Animal();  
  30.         animal.Eat();  
  31.  
  32.         Animal dog = new Dog();  
  33.         dog.Eat();  
  34.  
  35.         Animal wolfdog = new WolfDog();  
  36.         wolfdog.Eat();  
  37.  
  38.     }  

輸出結(jié)果:

Animal Eat ...

Dog Eat ...

WolfDog Eat ...

OK,現(xiàn)在得到了肯定的答案,不管繼承關(guān)系包含了多少層,都可以在子類中對父類中已經(jīng)重寫的方法繼續(xù)進行重寫。即如果父類方法用override修飾,子類繼承了該方法,同時也可以用override修飾,多重繼承中的C#多態(tài)就是如此實現(xiàn)。要想終止這種重寫,只需重寫方法時使用sealed關(guān)鍵字。

【編輯推薦】

  1. 總結(jié)C#哈希表的用法
  2. 不一樣的入門:看C# Hello World的17種寫法
  3. 什么是WMI?及其示例
  4. 從C#到C++容易出現(xiàn)的問題解答
  5. 淺議.NET、ASP.NET和C#的關(guān)系
責(zé)任編輯:book05 來源: cnblogs
相關(guān)推薦

2009-08-27 16:03:31

從c#到c++

2018-04-20 08:37:23

災(zāi)難恢復(fù)數(shù)據(jù)備份

2009-09-01 18:29:10

C#繼承C#多態(tài)

2010-01-03 20:52:27

2019-02-01 14:45:41

前端

2017-11-20 16:17:50

智慧城市

2009-08-17 15:52:42

C#多態(tài)

2009-09-01 14:51:19

C#多態(tài)性

2011-05-24 09:15:26

JavaC#

2018-06-26 10:59:31

虛擬化云計算核心技術(shù)

2009-08-28 16:48:50

C#多態(tài)性

2009-09-01 15:08:18

C#多態(tài)性

2009-08-25 09:58:56

C#參數(shù)不同點

2009-08-20 10:39:00

Java與C#的不同之

2011-03-30 08:27:48

C#

2009-08-12 14:59:09

C#和Java不同點

2020-02-04 09:53:05

數(shù)據(jù)安全數(shù)據(jù)泄漏信息安全

2019-04-28 16:10:50

設(shè)計Redux前端

2009-08-06 15:26:18

C#異常類型

2015-05-05 11:04:31

CoreOS自動化運維
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 久久久久亚洲 | 亚洲乱码一区二区三区在线观看 | 亚洲网站在线观看 | 亚洲视频在线观看免费 | 国产精品视频一区二区三 | 久久伦理电影 | 青青草网站在线观看 | 久久久91精品国产一区二区三区 | 狠狠综合久久av一区二区老牛 | 中文在线播放 | 狠狠干网站 | 亚洲精品久久久蜜桃网站 | 中文字字幕一区二区三区四区五区 | 日韩精品一区二区三区中文在线 | 在线小视频 | 毛片区 | 国产精品久久在线观看 | 国产成人99久久亚洲综合精品 | 在线天堂免费中文字幕视频 | 日韩欧美福利视频 | 日韩欧美三区 | 久久久99国产精品免费 | 国产高清免费视频 | 91精品久久久久久久久久小网站 | 亚洲精品二区 | 亚洲一av | 蜜桃视频一区二区三区 | 日韩成人免费视频 | 亚洲成人久久久 | 在线观看免费av网 | a级黄色片视频 | 国产午夜精品理论片a大结局 | 一级黄色片网址 | 免费精品久久久久久中文字幕 | 精品1区2区 | 99热电影| 91精品国产综合久久婷婷香蕉 | 国产黄色麻豆视频 | 精品久久久久久久久久久久久久久久久 | 久草中文在线 | 韩国理论电影在线 |