日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
OO世界中的核心概念.NET中的多態(tài)

多態(tài)(Polymorphism)一詞源于生物學(xué),顧名思義就是指多種形態(tài)。在面向?qū)ο笫澜缋铮鄳B(tài)與繼承和封裝一起構(gòu)成了三大核心概念。

在滄源等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都做網(wǎng)站、網(wǎng)站制作 網(wǎng)站設(shè)計(jì)制作按需設(shè)計(jì)網(wǎng)站,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站建設(shè),營銷型網(wǎng)站,外貿(mào)網(wǎng)站制作,滄源網(wǎng)站建設(shè)費(fèi)用合理。

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

大家應(yīng)該很熟悉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.     }  
  32. }  

MallardDuck和RubberDuck雖然都繼承自抽象類Duck,同樣擁有Quack()方法,但它們卻有不同的實(shí)現(xiàn),產(chǎn)生不同的結(jié)果。在聲明Duck類型時(shí),既可以實(shí)例化為Mallard,也可以實(shí)例化為RubberDuck,或者是其他繼承自Duck的類,在運(yùn)行時(shí),將自動(dòng)調(diào)用各個(gè)子類的實(shí)現(xiàn)。

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

不一樣的多態(tài)

然而,既然多態(tài)是指同一類事物之間的不同形態(tài),那么我們?yōu)槭裁匆褜?duì)于多態(tài)的理解局限于類的繼承關(guān)系呢?在.NET中是否還存在著非繼承關(guān)系的多態(tài)性呢?

泛型體現(xiàn)了參數(shù)的多態(tài)性

類型參數(shù)在泛型中通常解釋為占位符,而我更愿意將其理解為對(duì)參數(shù)的一種抽象。以最常見的List< T>為例,List< string>和List< int>在語法上完全相同,僅僅是類型參數(shù)有所不同,然而它們卻是兩個(gè)完全不同的類。也就是說,是類型參數(shù)的不同,導(dǎo)致了不同的類的形態(tài)。

 
 
 
  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< string>,在內(nèi)部就會(huì)聲明一個(gè)字符串?dāng)?shù)組,Add方法的參數(shù)也必須為string。如果使用MyList< int>,在內(nèi)部就會(huì)聲明一個(gè)int數(shù)組,Add方法的參數(shù)也必須為int。這看上去就像是T是string和int的“基類”,在使用MyList< T>時(shí)(相當(dāng)于客戶端代碼),T既可以是string也可以是int,或者是其他符合約束的類型,但在設(shè)計(jì)時(shí),我們對(duì)這一切毫無所知。

您是否也覺得這是多態(tài)性的一種體現(xiàn)呢?

再來看看十分經(jīng)典的Swap< T>的例子。

 
 
 
  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< T>泛型方法就像是封裝了N個(gè)非泛型的Swap方法,如Swap(ref int o1, ref int o2)、Swap(ref string o1, ref string o2)等等。在類型推斷特性的支持下,您甚至可以像使用非泛型方法一樣來使用泛型方法。參數(shù)T在某種程度上體現(xiàn)了不同的參數(shù)形態(tài),因此我們有理由認(rèn)為,泛型類型T體現(xiàn)了參數(shù)的多態(tài)性。

委托體現(xiàn)了方法的多態(tài)性

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

 
 
 
  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.     }  
  29. }  

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

您是否也認(rèn)為這是方法的多態(tài)性的一種體現(xiàn)呢?

小結(jié)

我們通常所討論的多態(tài),就是指子類對(duì)父類方法的重寫(虛方法)或覆蓋(非虛方法),這樣的理解未免過于狹隘。.NET強(qiáng)大的特性能夠?qū)崿F(xiàn)其他語言中無法實(shí)現(xiàn)的多態(tài)性。


網(wǎng)頁標(biāo)題:OO世界中的核心概念.NET中的多態(tài)
文章起源:http://www.5511xx.com/article/djhephe.html