C#實現多態之接口。


一、什么是接口?

  接口就是一種規范協議,約定好遵守某種規范就可以寫通用的代碼。

  定義了一組具有各種功能的方法(只是一種能力,沒有具體實現,就像抽象方法一樣,“光說不做”)。

  理解:內存該做成什么樣的:電壓多少,插線多少,這是一種國際規范,是接口。而,內存這個東西具體生產出來了,就是實現接口。不管是什么品牌的電腦,買來內存都能用,這是多態。

  接口可以包含:方法、屬性、索引器,事件。  其實都是方法。

  接口中的所有成員,都不能寫任何訪問修飾符,默認是public。

  接口的成員,子類必須實現。

二、接口的作用。

  接口可以實現多繼承。

  接口解決了不同類型之間的多態問題,比如魚和船不是同一種類型,但是都能在水里“游泳”,只是方式不同,所以可用接口。(下面實例最后一步,邏輯上,car不屬於person類,但是仍然可以實現多態)

三、實例。

我想登記每個國家的人,可以使用方法重載,傳入不同類型的參數,實現對應的方法,但是會寫很多。 而且如果要添加一個國家的人,得改代碼,可擴展性差。

class Program
    {
        static void Main(string[] args)
        {
            Chinese chinese = new Chinese();
            DengJi(chinese);
            American american = new American();
            DengJi(american);
        }
        public static void DengJi(Chinese chinese)
        {
            chinese.Show();
        }
        public static void DengJi(American american)
        {
            american.Show();
        }
    }
    class Chinese
    {
        public void Show()
        {
            Console.WriteLine("中國人,18歲");
        }
    }
    class American
    {
        public  void Show()
        {
            Console.WriteLine("美國人,19");
        }
    }

優化一:通過繼承實現多態, 用參數的時候用父類,具體操作看父類中存儲的對象。------     提取出父類Person,使用虛方法或者抽象方法。因為Person不需要實例化,所以我用抽象類。

class Program
    {
        static void Main(string[] args)
        {
            Chinese chinese = new Chinese();
            DengJi(chinese);
            American american = new American();
            DengJi(american);
        }
        public static void DengJi(Person person)
        {
            person.Show();
        }     
    }
    public abstract class Person
    {
        public abstract void Show();
    }
    class Chinese:Person
    {
        public override void Show()
        {
            Console.WriteLine("中國人,18歲");
        }
    }
    class American:Person
    {
        public override void Show()
        {
            Console.WriteLine("美國人,19");
        }
    }

優化二:如果我要登記一輛車,車繼承了Person類,不符合邏輯,但我又要實現多態,任何東西都能登記。所以我選擇用接口。

 class Program
    {
        static void Main(string[] args)
        {
            Chinese chinese = new Chinese();
            DengJi(chinese);
            Car car = new Car();
            car.Show();
        }
        public static void DengJi(IShowInfo person)
        {
            person.Show();
        }     
    }
    public interface IShowInfo
    {
        void Show();
    }
    public abstract class Person:IShowInfo
    {
        public abstract void Show();
    }
    class Chinese:Person
    {
        public override void Show()
        {
            Console.WriteLine("中國人,18歲");
        }
    }
    class American:Person
    {
        public override void Show()
        {
            Console.WriteLine("美國人,19");
        }
    }
    class Car :IShowInfo
    {
        public void Show()
        {
            Console.WriteLine("本田,2.0t");
        }
    }

這樣一來,無論什么東西,只要繼承了接口,都能登記。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM