关于CollectionBase
2011-12-04 23:35
218 查看
今天看了一下C#中接口的东西,发现对CollectionBase(为强类型集合提供抽象基类)中的具体实现原理不是很了解。经过查看一些资料,分析过后得到以下的初步认识。
system.Collections.CollectionBase类主要显示的实现ICollection和IList接口和IEnumerable接口。但只提供了一些要求的执行代码,特别是IList的Clear()和RemoveAt()方法,以及ICollection 的 Count属性,如果要使用提供的功能,就需要自己执行其他代码。具体的显示接口实现,可以查看MSDN的相关资料。(注:ICollection主要是实现将自己的项目复制到一个项目中,IList接口主要用于按照索引单独访问的一组对象)。由于IList接口成员很多,在这里就用Add接口成员来描述,并给出一个《C#入门经典》的例子的阐述。为了便于完成任务,CollectionBase提供了两个受保护的属性(List 和 InnerList),它们可以访问存储的对象本身。(下面的例子就用到了List)
我们的目的是实现一个强类型集合,并且实现基本的添加,删除,和索引访问。这些实现都是通过继承CollectionBase类和使用IList接口来实现的。首先看CollectionBase的几个主要成员:
List成员定义: protected IList List {get;} //一个List属性
显示接口实现: int IList.Add( object value) //一个显示实现
我们通过List属性调用显示接口来实现元素的添加。同样删除和索引访问都要使用List属性成员来调用显示接口。
CollectionBase实际上就是MS提供给我们的一个简化实现了IList接口的抽象基类。利用它可以使我们更加方便的自定义强类型的集合类。
通过使用Reflector可以发现,CollectionBase这个抽象基类,实际上继承了IList,ICollection和IEnumerable三个接口,并且显式地实现了IList接口的Add()和Remove()等方法,另外提供了一个受保护的属性IList List以方便我们使用。
public abstract class CollectionBase : IList, ICollection, IEnumerable
//强类型化定制集合类
//===========================================================
using System;
using System.Collections;
namespace Ch11Ex02
//======================Animal.cs ============================
//Animal类,其对象作为Animals集合类的项目
//===========================================================
using System;
namespace Ch11Ex02
//======================Class1.cs ============================
//主类,一个应用程序
//===========================================================
using System;
namespace Ch11Ex02
{
/**//// <summary>
/// Class1 的摘要说明。
/// </summary>
class Class1
{
/**//// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
{
//
// TODO: 在此处添加代码以启动应用程序
//
Animals animalCollection=new Animals();
animalCollection.Add(new Cow("Jack"));
animalCollection.Add(new Chicken("Vera"));
foreach(Animal myAnimal in animalCollection)
{
myAnimal.Feed();
}
}
}
}
在实际的使用中,为什么我们经常使用List 或者ArrayList 集合类,而很少从CollectionBase中派生集合类呢?我一直不明白,在读《C#入门经典》第三版中,“泛型”一章中有段话是这样描述这个问题的:
为什么不使用CollectionBase中派生类?
实际上,很多情况下,我们都不会从CollectionBase中派生类。知道内部的工作原理是好事,因为List<T>以相同的方式工作,但CollectionBase是向后兼容的。使用CollectionBase的唯一场合是要更多的控制向类的的用户展示的成员。如果希望集合类的Add()方法使用内部访问修饰符,则使用CollectionBase是最佳选择。
system.Collections.CollectionBase类主要显示的实现ICollection和IList接口和IEnumerable接口。但只提供了一些要求的执行代码,特别是IList的Clear()和RemoveAt()方法,以及ICollection 的 Count属性,如果要使用提供的功能,就需要自己执行其他代码。具体的显示接口实现,可以查看MSDN的相关资料。(注:ICollection主要是实现将自己的项目复制到一个项目中,IList接口主要用于按照索引单独访问的一组对象)。由于IList接口成员很多,在这里就用Add接口成员来描述,并给出一个《C#入门经典》的例子的阐述。为了便于完成任务,CollectionBase提供了两个受保护的属性(List 和 InnerList),它们可以访问存储的对象本身。(下面的例子就用到了List)
我们的目的是实现一个强类型集合,并且实现基本的添加,删除,和索引访问。这些实现都是通过继承CollectionBase类和使用IList接口来实现的。首先看CollectionBase的几个主要成员:
List成员定义: protected IList List {get;} //一个List属性
显示接口实现: int IList.Add( object value) //一个显示实现
我们通过List属性调用显示接口来实现元素的添加。同样删除和索引访问都要使用List属性成员来调用显示接口。
CollectionBase实际上就是MS提供给我们的一个简化实现了IList接口的抽象基类。利用它可以使我们更加方便的自定义强类型的集合类。
通过使用Reflector可以发现,CollectionBase这个抽象基类,实际上继承了IList,ICollection和IEnumerable三个接口,并且显式地实现了IList接口的Add()和Remove()等方法,另外提供了一个受保护的属性IList List以方便我们使用。
public abstract class CollectionBase : IList, ICollection, IEnumerable
//强类型化定制集合类
//===========================================================
using System;
using System.Collections;
namespace Ch11Ex02
//======================Animal.cs ============================
//Animal类,其对象作为Animals集合类的项目
//===========================================================
using System;
namespace Ch11Ex02
//======================Class1.cs ============================
//主类,一个应用程序
//===========================================================
using System;
namespace Ch11Ex02
{
/**//// <summary>
/// Class1 的摘要说明。
/// </summary>
class Class1
{
/**//// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
{
//
// TODO: 在此处添加代码以启动应用程序
//
Animals animalCollection=new Animals();
animalCollection.Add(new Cow("Jack"));
animalCollection.Add(new Chicken("Vera"));
foreach(Animal myAnimal in animalCollection)
{
myAnimal.Feed();
}
}
}
}
在实际的使用中,为什么我们经常使用List 或者ArrayList 集合类,而很少从CollectionBase中派生集合类呢?我一直不明白,在读《C#入门经典》第三版中,“泛型”一章中有段话是这样描述这个问题的:
为什么不使用CollectionBase中派生类?
实际上,很多情况下,我们都不会从CollectionBase中派生类。知道内部的工作原理是好事,因为List<T>以相同的方式工作,但CollectionBase是向后兼容的。使用CollectionBase的唯一场合是要更多的控制向类的的用户展示的成员。如果希望集合类的Add()方法使用内部访问修饰符,则使用CollectionBase是最佳选择。
相关文章推荐
- 关于CollectionBase
- 关于CollectionBase
- 用CollectionBase实现自定义实体对象
- 关于this和base
- 关于BaseAdapter的getView方法提示错误
- 关于:java.util.MissingResourceException: Can't find bundle for base name merchantInfo, locale zh_CN
- U-Boot中关于TEXT_BASE,代码重定位,链接地址相关说明
- 关于jsp的basepath
- 关于MongoDBVUE无法显示collection的解决方案
- 使用 FCM 关于推送无法接收的问题(Firebase 推送)
- 在ofbiz 的启动类:org.ofbiz.base.start.Start中发现一个关于comm.jar包是否需要的错误
- 关于listview的baseadapter的convertView复用问题
- 关于collectionView.performBatchUpdates()方法
- spring使用@value关于<context:component-scan base-package=”com.baidu” />的一个错误
- 关于[move_base-2] process has died执行错误的解决方案
- 关于Base使用的问题(希望高手路过能指点一二,十分感谢)
- The NOTE of learning ASP.NET [6] 关于 .NET BCL(Base Class Library,基础类库)
- A resolve about winform dataGrid dataSource binding to CollectionBase
- 关于从别处导入工程进eclipse后,res的values中styles中<style name="AppBaseTheme"出现问题解决办法
- Result Maps collection already contains value for Mapper.BaseResultMap错误原因