泛型接口的實現和調用


一,什么是泛型?

泛型:通過參數化類型來實現在同一份代碼上操作多種數據類型。利用“參數化類型”將類型抽象化,從而實現靈活的復用。在.NET類庫中處處都可以看到泛型的身影,尤其是數組和集合中,泛型的存在也大大提高了程序員的開發效率。

二,泛型的優點:

1>當在一個功能模塊實現就是同一種方法,而類型不同導致系統實現多次的拆箱和裝箱的操作,這將在托管堆上分配和回收大量的變量,若數據量大,則性能損失非常嚴重。 在處理引用類型時,雖然沒有裝箱和折箱操作,但將用到數據類型的強制轉換操作,增加處理器的負擔,而泛型剛好可以解決這個問題

2>使用泛型類型可以最大限度地重用代碼、保護類型的安全以及提高性能。

3>在MSDN中用ArrayList的代碼介紹非泛型時的缺點,地址:https://msdn.microsoft.com/zh-cn/library/b5bx6xee.aspx:

在公共語言運行時和 C# 語言的早期版本中,通用化是通過在類型與通用基類型 Object 之間進行強制轉換來實現的,泛型提供了針對這種限制的解決方案。 通過創建泛型類,您可以創建一個在編譯時類型安全的集合。

使用非泛型集合類的限制可以通過編寫一小段程序來演示,該程序使用 .NET Framework 類庫中的 ArrayList 集合類。 ArrayList 是一個使用起來非常方便的集合類,無需進行修改即可用來存儲任何引用或值類型。

 // The .NET Framework 1.1 way to create a list:
            System.Collections.ArrayList list1 = new System.Collections.ArrayList();
            list1.Add(3);
            list1.Add(105);

            System.Collections.ArrayList list2 = new System.Collections.ArrayList();
            list2.Add("It is raining in Redmond.");
            list2.Add("It is snowing in the mountains.");

但這種方便是需要付出代價的。 添加到 ArrayList 中的任何引用或值類型都將隱式地向上強制轉換為 Object。 如果項是值類型,則必須在將其添加到列表中時進行裝箱操作,在檢索時進行取消裝箱操作。 強制轉換以及裝箱和取消裝箱操作都會降低性能;在必須對大型集合進行循環訪問的情況下,裝箱和取消裝箱的影響非常明顯

三,在使用泛型處理類似情況,客戶端代碼基於每個實例指定這些類要使用的具體數據類型的方式。這樣將不再需要向上強制轉換為 T:System.Object,同時,也使得編譯器可以進行類型檢查。這樣增強了代碼的通用性和減少代碼的重復性。例子如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace InterfaceTdemo
{
    //定義泛型接口
    public interface ISay<T, U> where T : class
    {
        void SpeakEn(T t);

        void SpeakCh(U u);
    }

    //定義實體類
    public class English
    {
        public string Content { get; set; }
    }

    //定義實體類
    public class Chinese
    {
        public string Content { get; set; }
    }
    //定義實體類
    public class English2
    {
        public string Content { get; set; }
    }

    //定義實體類
    public class Chinese2
    {
        public string Content { get; set; }
    }

    //實現泛型接口中的方法
    public class Say : ISay<English, Chinese>    //繼承並實現接口
    {
        public void SpeakEn(English en)
        {
            Console.WriteLine(en.Content);
        }

        public void SpeakCh(Chinese ch)
        {
            Console.WriteLine(ch.Content);
        }
    }

    //實現泛型接口中的方法2
    public class Say2 : ISay<English2, Chinese2>    //繼承並實現接口
    {
        public void SpeakEn(English2 en)
        {
            Console.WriteLine(en.Content);
        }

        public void SpeakCh(Chinese2 ch)
        {
            Console.WriteLine(ch.Content);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            English en = new English();
            en.Content = "English";
            Chinese ch = new Chinese();
            ch.Content = "中文";
            English2 en2 = new English2();
            en2.Content = "English2";
            Chinese2 ch2 = new Chinese2();
            ch2.Content = "中文2";

            //通過傳不同的類型實現調用不同的方法,分別調用相同接口不同類型的實現方法
            ISay<English, Chinese> Is = new Say();
            Is.SpeakCh(ch);
            Is.SpeakEn(en);

            ISay<English2, Chinese2> Is2 = new Say2();
            Is2.SpeakCh(ch2);
            Is2.SpeakEn(en2);
        }
    }
}

 綜上:

1》與 ArrayList 相比,使用泛型就是添加的唯一語法是聲明和實例化中的類型參數,ISay<English2, Chinese2> Is2 = new Say2();而這類型參數就是你自己傳過去

2》泛型編程的思想:通過參數化類型來實現在同一份代碼上操作多種數據類型。利用“參數化類型”將類型抽象化,從而實現靈活的復用。


免責聲明!

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



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