您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關如何淺談.NET中不一樣的多態(tài),小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
在.NET中,多態(tài)通常意味著子類對于父類一種衍變。子類繼承自父類,擁有父類所定義的一切(public或protected)成員。但同時,它又可以修改(重寫或復寫)這些成員,使其實現(xiàn)與父類以及其他子類完全不同。我們可以說,繼承體現(xiàn)了類的多態(tài)性。
大家應該很熟悉Duck的例子了吧?
public abstract class Duck { public abstract void Quack(); } public class MallardDuck : Duck { public override void Quack() { Console.WriteLine("Quack, quack, quack..."); } } public class RubberDuck : Duck { public override void Quack() { Console.WriteLine("Squeak, squeak, squeak..."); } } public class Program { public static void Main() { Duck duck = new MallardDuck(); duck.Quack(); duck = new RubberDuck(); duck.Quack(); Console.ReadLine(); } }
MallardDuck和RubberDuck雖然都繼承自抽象類Duck,同樣擁有Quack()方法,但它們卻有不同的實現(xiàn),產(chǎn)生不同的結果。在聲明Duck類型時,既可以實例化為Mallard,也可以實例化為RubberDuck,或者是其他繼承自Duck的類,在運行時,將自動調用各個子類的實現(xiàn)。
多態(tài)的這些特性使依賴注入和面向抽象編程成為可能,其重要性不言而喻。
不一樣的多態(tài)
然而,既然多態(tài)是指同一類事物之間的不同形態(tài),那么我們?yōu)槭裁匆褜τ诙鄳B(tài)的理解局限于類的繼承關系呢?在.NET中是否還存在著非繼承關系的多態(tài)性呢?
泛型體現(xiàn)了參數(shù)的多態(tài)性
類型參數(shù)在泛型中通常解釋為占位符,而我更愿意將其理解為對參數(shù)的一種抽象。以最常見的List
public class MyList<T> { private T[] items; private int size; public void Add(T item) { if (size == items.Length) { // modify capacity } items[size++] = item; } }
如果我們使用MyList
您是否也覺得這是多態(tài)性的一種體現(xiàn)呢?
再來看看十分經(jīng)典的Swap
public class Swapper { private static void Swap<T>(ref T o1, ref T o2) { T temp = o1; o1 = o2; o2 = temp; } }
Swap
委托體現(xiàn)了方法的多態(tài)性
委托是對擁有相同參數(shù)和返回值的所有方法的封裝。只要方法擁有同樣的參數(shù)列表和返回值,委托都認為它們屬于同一“類型”的方法,可以添加到同一個委托鏈表中。
public delegate void FooDelegate(List<string> list, string str); public class DelegateTest { public void AddToList(List<string> list, string strToAdd) { list.Add(strToAdd); } public static void PrintIfContains(List<string> list, string strToCheck) { if (list.Contains(strToCheck)) Console.WriteLine("The list contains " + strToCheck); } } public class Program { public static void Main() { List<string> list = new List<string>(); list.Add("Kirin"); DelegateTest delegateTest = new DelegateTest(); FooDelegate fooDelegate = new FooDelegate(delegateTest.AddToList); fooDelegate += new FooDelegate(DelegateTest.PrintIfContains); fooDelegate(list, "麒麟.NET"); Console.ReadLine(); } }
在上例中,F(xiàn)ooDelegate委托封裝了參數(shù)為List
您是否也認為這是方法的多態(tài)性的一種體現(xiàn)呢?
多態(tài)小結
我們通常所討論的多態(tài),就是指子類對父類方法的重寫(虛方法)或覆蓋(非虛方法),這樣的理解未免過于狹隘。.NET強大的特性能夠實現(xiàn)其他語言中無法實現(xiàn)的多態(tài)性。如本文所列舉的泛型和委托。您是否認同筆者的觀點呢?如果認同,您是否還能舉出其他的例子呢?
您可能覺得本文缺乏技術含量。的確是的,本文并不包含多么高深的技術和思想,而只是筆者最近學習過程中一些瑣碎的領悟。如果能夠幫助到您,將是筆者的榮幸。
以上就是如何淺談.NET中不一樣的多態(tài),小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降摹OM隳芡ㄟ^這篇文章學到更多知識。更多詳情敬請關注億速云行業(yè)資訊頻道。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。