C#實(shí)現(xiàn)協(xié)變和逆變案例
關(guān)于協(xié)變逆變,SolidMango的解釋是比較可取的。有了協(xié)變,比如,在需要返回IEnumerable<object>類(lèi)型的時(shí)候,可以使用IEnmerable<string>來(lái)替代;有了逆變,比如,在需要接收IComparable<string>類(lèi)型形參方法中,可以使用IComparable<object>類(lèi)型實(shí)參來(lái)替代。
協(xié)變
先來(lái)體會(huì)協(xié)變。有2個(gè)具有繼承關(guān)系的父類(lèi)和子類(lèi)。
public class Animal { public string Name { get; set; } } public class Dog : Animal { public Dog(string dogName) { Name = dogName; } }
現(xiàn)在有一個(gè)幫助類(lèi)的方法的形參類(lèi)型是父類(lèi)集合IEnumerable<Animal>。
public class MyHelper { public void PrintAnimalNames(IEnumerable<Animal> animals) { foreach (var animal in animals) { Console.WriteLine(animal.Name); } } }
有了協(xié)變,可以在PrintAnimalNames方法中傳入IEnumerable<Dog>類(lèi)型的實(shí)參替代IEnumerable<Animal>類(lèi)型。
static void Main(string[] args) { List<Dog> dogs = new List<Dog>() { new Dog("小狗petty"), new Dog("小狗lily") }; //協(xié)變 IEnumerable<Animal> animals = dogs; MyHelper myHelper = new MyHelper(); myHelper.PrintAnimalNames(animals); Console.ReadKey(); }
可見(jiàn),在方法中基于基類(lèi)接口類(lèi)型的形參,調(diào)用該方法的時(shí)候可以傳入派生類(lèi)接口類(lèi)型的實(shí)參。
逆變
再來(lái)體會(huì)逆變。依然是2個(gè)具有繼承關(guān)系的父類(lèi)和子類(lèi)。
public class Animal { public string Name { get; set; } public int Age { get; set; } } public class Cat : Animal { public Cat(string catName, int catAge) { Name = catName; Age = catAge; } }
現(xiàn)在,我們想比較基類(lèi)Animal的兩個(gè)實(shí)例,為此,有必要專(zhuān)門(mén)寫(xiě)一個(gè)類(lèi)讓他實(shí)現(xiàn)IComparer<Animal>接口。
public class AnimalSizeComparator : IComparer<Animal> { public int Compare(Animal x, Animal y) { if (x != null && y != null) { if (x.Age > y.Age) { return 1; } else if (x.Age == y.Age) { return 0; } else { return -1; } } else { return -1; } } }
在幫助類(lèi)中的方法中,針對(duì)Cat進(jìn)行比較,方法接收IComparer<Cat>類(lèi)型的形參。
public class MyHelper { public void CompareCats(IComparer<Cat> catComparer) { var cat1 = new Cat("小貓1",1); var cat2 = new Cat("小貓2",2); if (catComparer.Compare(cat2, cat1) > 0) { Console.WriteLine("小貓2勝出"); } else { Console.WriteLine("小貓1勝出"); } } }
有了逆變,客戶(hù)端調(diào)用MyHelper的CompareCats方法時(shí),可以傳入IComparer<Animal>類(lèi)型的實(shí)參。
IComparer<Animal> animalComparer = new AnimalSizeComparator(); MyHelper myHelper = new MyHelper(); myHelper.CompareCats(animalComparer); Console.ReadKey();
可見(jiàn),在方法中基于派生類(lèi)接口類(lèi)型的形參,調(diào)用該方法的時(shí)候可以傳入基類(lèi)接口類(lèi)型的實(shí)參。
總結(jié):在本篇的場(chǎng)景中,派生類(lèi)接口替代父類(lèi)接口,稱(chēng)之為協(xié)變;父類(lèi)接口代替派生類(lèi)接口,稱(chēng)之為逆變。
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接
相關(guān)文章
c#中SqlHelper封裝SqlDataReader的方法
這篇文章主要介紹了c#中SqlHelper封裝SqlDataReader的方法,涉及C#針對(duì)數(shù)據(jù)庫(kù)相關(guān)操作封裝與使用的技巧,需要的朋友可以參考下2015-05-05C# 如何實(shí)現(xiàn)一個(gè)基于值相等性比較的字典
這篇文章主要介紹了C# 如何實(shí)現(xiàn)一個(gè)基于值相等性比較的字典,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下2021-02-02C#中如何在Excel工作表創(chuàng)建混合型圖表實(shí)例
本篇文章主要介紹了C#中如何在Excel工作表創(chuàng)建混合型圖表實(shí)例,具有一定的參考價(jià)值,有需要的可以了解一下。2016-11-11C#實(shí)現(xiàn)向函數(shù)傳遞不定參數(shù)的方法
這篇文章主要介紹了C#實(shí)現(xiàn)向函數(shù)傳遞不定參數(shù)的方法,涉及C#操作函數(shù)參數(shù)的相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04關(guān)于C#繼承的簡(jiǎn)單應(yīng)用代碼分析
在本篇文章里小編給大家整理了一篇關(guān)于C#繼承的簡(jiǎn)單應(yīng)用代碼分析內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2021-05-05C#影院售票系統(tǒng)畢業(yè)設(shè)計(jì)(2)
這篇文章主要介紹了C#影院售票系統(tǒng)畢業(yè)設(shè)計(jì),介紹了電影院座位的動(dòng)態(tài)繪制、電影信息綁定到窗體中如何展現(xiàn)出來(lái),需要的朋友可以參考下2015-11-11