Strong-Type Collection

在泛型类出现之前:

 

实现ICollection、IEnumerable、IList接口的目的是要创建对象与.NET Framework之间兼容互通的管道,但这样的做法却会引发另一个问题,那就是这些接口都使用object作为Collection中的元素类型,而.NET Framework所有的对象皆是源自object,这代表着用户可以放入所有对象于Collection对象中。往好的方面着眼,这是最具扩展性的设计方式,但往坏的方面着眼时,这种设计过于松散,容易令用户产生混淆与误用。那该如何兼顾两者呢?答案是Strong-Type Collection,下面是MyList集合的Strong-Type版本。

public class MyList: IList
{

   priavte ArrayList list;

   public MyList(){
     list = new ArrayList();
   }   
   

   #region IList Members
   public bool IsReadOnly
   {
     get{
       return false;
     }
   }

   object IList.this[int index]
   {
     get{
       return list[index];
     }
     set{
       list[index] =value;
     }
   }

   public string this[index]
   {
     get{
       return (string)list[index];
     }
     set{
       list[index] =value;
     }

   }
   
   public void RemoveAt(int index)
   {
     list.Remove(index);
   }

   public IList.Insert(int index,object value)
   {
     list.Insert(index,value);
   }

   //strong-type Insert
   public void Insert(int index,string value)
   {
     ((IList)this).Insert(index,value);
   }

   void IList.Remove(object value)
   {
     list.Remove(value);
   }

   //strong-type remove
   public void Remove(string value)
   {
     ((IList)this).Remove(value);
   }

   bool IList.Contains(object value)
   {
     return list.Contains(value);
   }

   //strong-type contains
   public bool Contains(string value)
   {
     return ((IList)this).Contains(value);
   }

   int IList.IndexOf(object value)
   {
     return list.IndexOf(value);
   }

   //strong-value contains
   public int IndexOf(string value)
   {
     return ((IList)this).IndexOf(value);
   }

   int IList.Add(object value)
   {
     return list.Add(value);
   }

   //strong-type Add.
   public int Add(string value)
   {
     return ((IList)this).Add(value);
   }

   public void Clear()
   {
     list.Clear();
   }

   public bool IsFixedSize
   {
     get{
       return false;
     }
   }

   #endregion

   #region ICollection Members
   public bool IsSynchronized;
   {
     get{
       return list.IsSynchronized;
     }
   }

   public int Count{
     get{
       return list.Count;
     }
   }

   public void CopyTo(Array array,int index)
   {
     list.CopyTo(array,index);
   }

   public object SyncRoot
   {
     get
     {
       return list.SyncRoot;
     }
   }
   #endregion

   #region IEnumberable Members
   public IEnumberator GetEnumberator()
   {
      return list.GetEnumerator();
   }
   #endregion

 }


 MyList将实现IList接口的函数与属性声明为IList接口的明确实现,一旦声明成明确实现,用户就无法在不转型成IList接口情况下调用这些函数,这可以有效防止误用的情况发生。只是没有这些函数的话,用户就无法操作此Collection了,因此MyList提供了另一组同名称的函数与属性给用户,并且以string为操作类型,这样就不会发生误用的情况了。是的!这样一来MyList的实现变得复杂了不少,但在鱼与熊掌要兼得得愿望下,付出点代价是难免的。

 

CollectionBase

针对设计人员对Strong-type Collection的需求,.NET Framework中提供了一个名为CollectionBase的基础类,其实此类的实现如同MyList类一样,提供了IList接口的基本实现,设计人员可以继承此类来加上额外的同名函数。

public class MyList2:CollectionBase
{

  public void Insert(string s)
  {
    List.Add(s);
  }
   
  public void Remove(string s)
  {
    List.Remove(s);
  }
  public void Add(string s)
  {
    List.Add(s);
  }
  public bool Contains(string s)
  {
     return List.Contains(s);
  }

  public int IndexOf(string s)
  {
    return List.IndexOf(s);
  }
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值