天天看点

C#——自定义泛型典例实战

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

namespace 自定义泛型
{
    /// <summary>
    /// @author ZJC
    /// 1.自定义泛型类
    /// 2.自定义泛型接口,封闭类型、开放类型介绍
    /// 3.泛型约束
    /// 泛型的目的也是为了代码重用
    /// </summary>
    class Program
    {
        //
        //class MyGeneric<T,K,L,D,C>
        //下面是一个自定义泛型类的实例
        class MyGeneric<T>
        {
            public class Car
            {
                Car()
                {
                    Console.WriteLine("Car...");
                }            
            }
            public class Course
            {
                Course()
                {
                    Console.WriteLine("course...");
                }
            }
            public MyGeneric(int len)
            {
                arr = new T[len];
            }
            private T[] arr;
            public T this[int index]        //索引器
            {
                get
                { 
                    return arr[index];
                }
                set
                {
                    arr[index] = value;
                }
            }
        }
        //以下是:自定义泛型接口  实例
        public interface ITest<T>
        {            
            void M1(T t);            
        }
        public class MyGeneric2 : ITest<string>     //封闭类型,固定为string
        {

            public MyGeneric2()
            {
                Console.WriteLine("kk");
            }
            public void M1(string t)
            {
                Console.WriteLine(t);
            }
        }
        public class MyGeneric3<T> : ITest<T>       //开放类型,类型不固定
        {          
            public void M1( T t)             
            {
                Console.WriteLine(t.GetType());
            }
        }
        //泛型约束
        public class Person<T, T1, T2>
            where T : struct
            where T1 : class
            where T2 : new()
            //约束了T 必须是【值类型】,T1 必须是【引用类型】,T2这个类型必须带有无参构造函数,要求构造函数不能为私有且类型不能是抽象的。
        {
            public T age
            {
                get;
                set;
            }
            public T1 Mycourse
            {
                get;
                set;
            }
            public T2 Mycar
            {
                get;
                set;
            }
        }        
        static void Main(string[] args)
        {
            MyGeneric<string> test = new MyGeneric<string>(3);
            test[0] = "成龙";
            test[1] = "李连杰";
            test[2] = "甄子丹";
            Console.WriteLine(test[0]+"\n"+test[1]+"\n"+test[2]);
            MyGeneric2 test2 = new MyGeneric2();
            test2.M1("自定义泛型接口");
            MyGeneric3<int> test3 = new MyGeneric3<int>();
            test3.M1(5);
            Person<int,MyGeneric2,MyGeneric2> test4 = new Person<int,MyGeneric2,MyGeneric2>();
        }
    }
}