首页 > 代码库 > 第八章 泛型类

第八章 泛型类

1 概述

1.1 引入泛型的原因

先从一个例子来说明这个问题

    class AssembleSample    {        static void Main()        {            ContactTable cont = new ContactTable(10);            cont[0] = new Business("李明");            Assemble a = cont;            a[1] = new ClassMate("张鹏");            IOutput i = cont;            i.Output();        }    }    /// <summary>    /// 接口IAccessable    /// </summary>    public interface IAccessable    {        int Length        {            get;        }        object this[int index]        {            get;            set;        }        object GetAt(int index);        void SetAt(int index, object obj);    }    /// <summary>    /// 抽象类:集合Assemble    /// </summary>    public abstract class Assemble:IAccessable    {        //字段        protected object[] m_list;        //属性        public int Length        {            get            {                return m_list.Length;            }        }        //索引函数        public object this[int index]        {            get            {                return m_list[index];            }            set            {                m_list[index] = value;            }        }        //构造函数        public Assemble(int iLength)        {            m_list = new object[iLength];        }        //方法        public object GetAt(int index)        {            return m_list[index];        }        public void SetAt(int index, object obj)        {            m_list[index] = obj;        }    }    /// <summary>    /// 派生类:联系人集合    /// </summary>    public class ContactTable:Assemble,IOutput    {        //覆盖索引函数        public new Contact this[int index]        {            get            {                return (Contact)m_list[index];            }            set            {                m_list[index] = value;            }        }                //构造函数        public ContactTable(int iLength)            : base(iLength)        {        }        //方法        public new Contact GetAt(int index)        {            return (Contact)m_list[index];        }        public void SetAt(int index, Contact c)        {            m_list[index] = c;        }        void IOutput.Output()        {            foreach (Contact c in m_list)            {                if (c != null)                    c.Output();            }        }    }
View Code

程序输出结果:

商务:李明先生/女士办公电话:未知手机:未知商务传真:未知同学:张鹏住宅电话:未知办公电话:未知手机:未知生日:0001-1-1 0:00:00请按任意键继续. . .

上例中的派生类ContactTable是从基类Assemble中继承,但是在它的索引函数以及GetAt方法的定义中,方法成员的返回类型与基类不一致,因此不能算是重载(override)方法,而是覆盖(new)方法。对于基类和派生类的的SetAt方法,由于方法参数不同,它们根本就是两个不同的方法。

第八章 泛型类