關於泛型的理解

什麼叫泛型?

以下爲自己的個人理解:
是把重複的類進行一個整合防止類型膨脹,成員膨脹。
在定義一個類,接口,方法等的時候不明確定義類型用 <類型參數> 來定義,等要使用的時候再去明確定義,這就是泛型。

類型參數是指一個泛化的類型,就是用一個標識符來表示,標識符是由自己命名,可以是ABD,DSD。

泛型有正交性,個人理解是有許多種泛型:泛型類,泛型接口,泛型委託,泛型方法等等

例子1 泛型類:
下面是一個商店裏的包裝,商店裏的蘋果和書本用盒子裝起來,因爲蘋果和書長不一樣,所以我要使用不同的盒子。
打個比方,蘋果有不同顏色和牌子,有青蘋果和紅蘋果,有富士山蘋果等等,所以我要在蘋果的盒子上寫蘋果的顏色(color)和牌子(brand),書有很多,每本書的作者也可能不一樣,比如哈姆雷特是莎士比亞寫的,悲慘世界是雨果寫的,在書的盒子外面要寫上作者(Author)和名字(Name)來區分。
於是就有了蘋果盒子(AppleBox),書本盒子(BookBox),但是他們本質上都是盒子,那麼我們可以先把盒子買來,但是先不決定它是什麼盒子(假設這裏的這個盒子貼上啥標籤就會變成什麼盒子),等要用盒子的時候,再給這個盒子貼上標籤來確定是蘋果盒子還是書本盒子。
我的蘋果和書本分別是Apple和Book類型,把盒子定義爲一個泛型類(Box),它的類型定義爲,TCargo是我自己的定義的,表示貨物類型,這個<>裏面的標識符由自己定義,當我要使用盒子的時候,就把TCargo改爲我要裝進去的物品類型,比如是書本盒子就變成Box,以下是具體例子



        static void Main(string[] args)
        {
   
   
            Apple apple = new Apple {
   
    Color = "Red" ,Brand="富士山"};
            Book book = new Book {
   
    Name = "哈姆雷特" ,Author="莎士比亞"};
            Box<Apple> box1 = new Box<Apple> {
   
    Cargo = apple };
            Box<Book> box2 = new Box<Book> {
   
    Cargo = book };
            Console.WriteLine("蘋果顏色:{0},牌子:{1}", box1.Cargo.Color,box1.Cargo.Brand);
            Console.WriteLine("書名:{0},作者:{1}",box2.Cargo.Name,box2.Cargo.Author);
        }

        class Apple
        {
   
   
            public string Color {
   
    get; set; }
            public string Brand {
   
    get; set; }

        }

        class Book
        {
   
   
            public string Name {
   
    get; set; }
            public string Author {
   
    get; set; }

        }

        class Box<TCargo>
        {
   
   
            public TCargo Cargo {
   
    get; set; }
        }

運行結果
在這裏插入圖片描述
例子2 泛型接口:

static void Main(string[] args)
    {
   
   
        Student<ulong> student = new Student<ulong> {
   
    };
//使用接口時沒有特化泛型接口
        student.ID = 10000000000001;
        student.Name = "莎士比亞";
//使用接口時特化泛型接口
        Teacher teacher = new Teacher {
   
    };
        teacher.ID = 1000000000000001;
        teacher.Name = "孔子";
    }

    interface IUnique<TId>
    {
   
   
        TId ID {
   
    get; set; }
    }


//使用接口時沒有特化泛型接口
    class Student<TId> : IUnique<TId>
    {
   
   
        public TId ID {
   
    get; set; }
        public string Name;
    }

//使用接口時特化泛型接口
    class Teacher : IUnique<ulong>
    {
   
   
        public ulong ID {
   
    get; set; }
        public string Name;
    }
}

例子3 泛型方法

static void Main(string[] args)
{
   
   
    int[] a1 = {
   
    1, 3, 5, 7 };
    int[] a2 = {
   
    2, 4, 6, 8 };
    double[] a3 = {
   
    1.1, 3.3, 5.5, 7.7 };
    double[] a4 = {
   
    2.2, 4.4, 6.6, 8.8 };
    var result = zip(a1, a2);
    Console.WriteLine(string.Join(",", result));
}

static T[] zip<T>(T[] a, T[] b)
{
   
   
    T[] zipped = new T[a.Length + b.Length];
    int ai = 0, bi = 0, zi = 0;
    do
    {
   
   
        if (ai < a.Length)
        {
   
   
            zipped[zi++] = a[ai++];
        }

        if (bi < b.Length)
        {
   
   
            zipped[zi++] = b[bi++];
        }
    } while (ai < a.Length || bi < b.Length);
    return zipped;
}

小筆記

記一下,以後有問題再回來改,如果有錯誤也可以在評論區指出
有待補充…

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章