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(); } } }
程序输出结果:
商务:李明先生/女士 办公电话:未知 手机:未知 商务传真:未知 同学:张鹏 住宅电话:未知 办公电话:未知 手机:未知 生日:0001-1-1 0:00:00 请按任意键继续. . .
上例中的派生类ContactTable是从基类Assemble中继承,但是在它的索引函数以及GetAt方法的定义中,方法成员的返回类型与基类不一致,因此不能算是重载(override)方法,而是覆盖(new)方法。对于基类和派生类的的SetAt方法,由于方法参数不同,它们根本就是两个不同的方法。
时间: 2024-10-15 20:47:26