欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#實(shí)現(xiàn)協(xié)變和逆變案例

 更新時(shí)間:2022年10月22日 14:16:53   作者:Darren Ji  
這篇文章介紹了C#實(shí)現(xiàn)協(xié)變和逆變的案例,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

關(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)文章

最新評(píng)論