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

淺談.NET中不一樣的多態

開發 后端
多態(Polymorphism)一詞源于生物學,顧名思義就是指多種形態。在面向對象世界里,多態與繼承和封裝一起構成了三大核心概念。本文將簡單談談.NET中不一樣的多態。

在.NET中,多態通常意味著子類對于父類一種衍變。子類繼承自父類,擁有父類所定義的一切(public或protected)成員。但同時,它又可以修改(重寫或復寫)這些成員,使其實現與父類以及其他子類完全不同。我們可以說,繼承體現了類的多態性。

大家應該很熟悉Duck的例子了吧?

  1. public abstract class Duck  
  2. {  
  3.     public abstract void Quack();  
  4. }  
  5.  
  6. public class MallardDuck : Duck  
  7. {  
  8.     public override void Quack()  
  9.     {  
  10.         Console.WriteLine("Quack, quack, quack...");  
  11.     }  
  12. }  
  13.  
  14. public class RubberDuck : Duck  
  15. {  
  16.     public override void Quack()  
  17.     {  
  18.         Console.WriteLine("Squeak, squeak, squeak...");  
  19.     }  
  20. }  
  21.  
  22. public class Program  
  23. {  
  24.     public static void Main()  
  25.     {  
  26.         Duck duck = new MallardDuck();  
  27.         duck.Quack();  
  28.         duck = new RubberDuck();  
  29.         duck.Quack();  
  30.         Console.ReadLine();  
  31.     }  

MallardDuck和RubberDuck雖然都繼承自抽象類Duck,同樣擁有Quack()方法,但它們卻有不同的實現,產生不同的結果。在聲明Duck類型時,既可以實例化為Mallard,也可以實例化為RubberDuck,或者是其他繼承自Duck的類,在運行時,將自動調用各個子類的實現。

多態的這些特性使依賴注入和面向抽象編程成為可能,其重要性不言而喻。

不一樣的多態
然而,既然多態是指同一類事物之間的不同形態,那么我們為什么要把對于多態的理解局限于類的繼承關系呢?在.NET中是否還存在著非繼承關系的多態性呢?

泛型體現了參數的多態性

類型參數在泛型中通常解釋為占位符,而我更愿意將其理解為對參數的一種抽象。以最常見的List為例,List和List在語法上完全相同,僅僅是類型參數有所不同,然而它們卻是兩個完全不同的類。也就是說,是類型參數的不同,導致了不同的類的形態。

  1. public class MyList<T> 
  2. {  
  3.     private T[] items;  
  4.     private int size;  
  5.     public void Add(T item)  
  6.     {  
  7.         if (size == items.Length)  
  8.         {  
  9.             // modify capacity  
  10.         }  
  11.         items[size++] = item;  
  12.     }  

如果我們使用MyList,在內部就會聲明一個字符串數組,Add方法的參數也必須為string。如果使用MyList,在內部就會聲明一個int數組,Add方法的參數也必須為int。這看上去就像是T是string和int的“基類”,在使用MyList時(相當于客戶端代碼),T既可以是string也可以是int,或者是其他符合約束的類型,但在設計時,我們對這一切毫無所知。

您是否也覺得這是多態性的一種體現呢?

再來看看十分經典的Swap的例子。

  1. public class Swapper  
  2. {  
  3.     private static void Swap<T>(ref T o1, ref T o2)  
  4.     {  
  5.         T temp = o1;  
  6.         o1 = o2;  
  7.         o2 = temp;  
  8.     }  

Swap泛型方法就像是封裝了N個非泛型的Swap方法,如Swap(ref int o1, ref int o2)、Swap(ref string o1, ref string o2)等等。在類型推斷特性的支持下,您甚至可以像使用非泛型方法一樣來使用泛型方法。參數T在某種程度上體現了不同的參數形態,因此我們有理由認為,泛型類型T體現了參數的多態性。

委托體現了方法的多態性

委托是對擁有相同參數和返回值的所有方法的封裝。只要方法擁有同樣的參數列表和返回值,委托都認為它們屬于同一“類型”的方法,可以添加到同一個委托鏈表中。

  1. public delegate void FooDelegate(List<string> list, string str);  
  2.  
  3. public class DelegateTest  
  4. {  
  5.     public void AddToList(List<string> list, string strToAdd)  
  6.     {  
  7.         list.Add(strToAdd);  
  8.     }  
  9.  
  10.     public static void PrintIfContains(List<string> list, string strToCheck)  
  11.     {  
  12.         if (list.Contains(strToCheck))  
  13.             Console.WriteLine("The list contains " + strToCheck);  
  14.     }  
  15. }  
  16.  
  17. public class Program  
  18. {  
  19.     public static void Main()  
  20.     {  
  21.         List<string> list = new List<string>();  
  22.         list.Add("Kirin");  
  23.         DelegateTest delegateTest = new DelegateTest();  
  24.         FooDelegate fooDelegate = new FooDelegate(delegateTest.AddToList);  
  25.         fooDelegate += new FooDelegate(DelegateTest.PrintIfContains);  
  26.         fooDelegate(list, "麒麟.NET");  
  27.         Console.ReadLine();  
  28.     }  

在上例中,FooDelegate委托封裝了參數為List和string,并且沒有返回值的方法。任何符合上述約束的方法,在FooDelegate中一視同仁。如,AddToList實例方法與PrintIfContains靜態方法除了參數列表與返回值相同外,內部實現完全不同,但是它們卻可以添加到同一個委托鏈表中。也就是說,同一個委托,可以定義并調用不同的方法(約束相同而實現不同)。

您是否也認為這是方法的多態性的一種體現呢?

多態小結

我們通常所討論的多態,就是指子類對父類方法的重寫(虛方法)或覆蓋(非虛方法),這樣的理解未免過于狹隘。.NET強大的特性能夠實現其他語言中無法實現的多態性。如本文所列舉的泛型和委托。您是否認同筆者的觀點呢?如果認同,您是否還能舉出其他的例子呢?

您可能覺得本文缺乏技術含量。的確是的,本文并不包含多么高深的技術和思想,而只是筆者最近學習過程中一些瑣碎的領悟。如果能夠幫助到您,將是筆者的榮幸。

【編輯推薦】

  1. ASP.NET開發程序過程中值得注意的兩個地方
  2. 全面總結.NET 4.0新特性:C#和VB.NET的取長補短
  3. 深入理解Java多態性
  4. ASP.NET的錯誤處理機制
  5. 詳解ASP.NET的四種狀態
責任編輯:彭凡 來源: cnblogs
相關推薦

2012-03-07 17:24:10

戴爾咨詢

2012-12-20 10:17:32

IT運維

2016-05-09 18:40:26

VIP客戶緝拿

2017-05-25 15:02:46

聯宇益通SD-WAN

2015-10-19 12:33:01

華三/新IT

2018-05-09 15:42:24

新零售

2009-02-04 15:43:45

敏捷開發PHPFleaPHP

2009-12-01 16:42:27

Gentoo Linu

2009-06-12 15:26:02

2011-02-28 10:38:13

Windows 8

2016-03-24 18:51:40

2009-01-20 10:39:00

Windows7IE 8瀏覽器

2015-08-04 14:49:54

Discover

2022-05-05 21:47:32

Linuxls 命令

2019-01-03 14:39:08

Oracle甲骨文ORACLE

2015-08-25 09:52:36

云計算云計算產業云計算政策

2013-01-11 18:10:56

軟件

2011-03-14 16:51:24

2021-12-23 15:11:46

Web 3.0元宇宙Metaverse

2024-04-08 09:11:13

SVG前端CSS
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 色女人天堂 | 亚洲欧美日韩在线不卡 | 欧美精品一区二区三区在线 | 国产美女一区二区 | 色婷婷激情综合 | 日本亚洲精品 | 亚洲高清在线 | 国产激情一区二区三区 | 夜夜夜久久久 | 亚洲a毛片 | 黄色一级大片在线免费看产 | 久久国产亚洲 | 中文在线亚洲 | 欧美一二三 | 九九亚洲| 免费99精品国产自在在线 | 国产午夜精品一区二区 | 亚洲精品视频在线播放 | 久久精品久久久久久 | 在线观看免费av网 | 亚洲精品视频一区 | 久久综合影院 | 午夜av电影 | 精品欧美一区二区三区久久久 | 欧美精品片 | 中文字幕亚洲区一区二 | 三级在线免费 | 午夜资源 | 日韩欧美在线观看视频 | 久久爱黑人激情av摘花 | 在线播放国产视频 | 精品国产乱码久久久久久蜜臀 | 国产高清精品一区二区三区 | 91精品国产91久久久久久最新 | 99热电影| 精品91久久久 | 欧美日韩中文字幕在线 | 九九在线精品视频 | 亚洲精品久久国产高清情趣图文 | 宅男伊人 | 中文字幕一区二区三区四区五区 |