当前位置:编程学习 > C#/ASP.NET >>

请运用面向对象的知识帮忙分析.net 中 DropDownList.Items.add()

   我现在的疑问是能够冒出DropDownList.Items.add() 中的add()方法 的 依据从何而来?

首先DropDownList是一个可视控件,实际上把它拖进.aspx页面中就变成了一个对象,既然是对象就应该具有对象的一些共性如类成员(包括字段,属性,方法,构造函数等)查了一下vs2005的帮助是这样写的:DropDownList 类是表示允许用户从下拉列表中选择一项的控件, 其中成员列表中有公共属性:Items   获取列表控件项的集合。(从 ListControl 继承。)
按照上边的定义解释,我这样写  DropDownList.Items 就是表示获得的是项的集合,那么DropDownList.Items.add() 中的add()方法从何而来?因为在vs2005帮助文档中DropDownList没有相关add()方法定义的介绍。
再查了一下集合有关知识:
集合,表示可以通过遍历每个元素来访问的一组对象(特别是可使用foreach循环访问)
一个集合包括多个元素,即有一个集合类对象和N个元素对象

因为任何集合类都实现了IEnumerable接口,所以任何集合类对象都有一个GetEnumerator()方法,该方法可以返回一个实现了 IEnumerator接口的对象,这个返回的IEnumerator对象既不是集合类对象,也不是集合的元素类对象,它是一个独立的类对象。通过这个对象,可以遍历访问集合类对象中的每一个元素对象

如果集合类是用户自定义的集合类,则用户必须实现它的GetEnumerator()方法,否则不能使用循环。当然,与这个自定义集合类对应的IEnumerator类(实现了该接口的类),也要自定义一个才行

比如,ArrayList集合类对应的IEnumerator是 ArrayListEnumeratorSimple
            Array集合类对应的IEnumerator是 SZArrayEnumerator
      (这两个类在.net framework类库文档(msdn)中都没有介绍)

1.System.Colloctions中表示集合的行为的接口有:
1)ICollection
定义所有集合的大小、枚举数和同步方法。派生于IEnumerable
它定义了集合类最基本的行为,所有的集合类都实现了这个接口(基接口)
但是它的行为太过基本:主要就是一个Count属性,单独实现它没有太大意义

2)IEnumerable
公开枚举数,该枚举数支持在集合上进行简单迭代
它只有一个方法 GetEnumerator(),该方法可以返回一个IEnumerator接口,通过它可以遍历集合
基本上所有的集合类都实现了这个接口

3)IList
IList实现是可排序且可按照索引访问其成员的值的集合,它本身实现了ICollection和IEnumerable接口
是所有列表的抽象基类。IList 实现有三种类别:只读、固定大小、可变大小。

4)IDictionary
IDictionary实现是键/值对的集合,它本身实现了ICollection和IEnumerable接口
是键/值对的集合的基接口。IDictionary 实现有三种类别:只读、固定大小、可变大小。
IDictionary可称为字典、映射或散列表,它根据键(任意类型)来访问值


2.System.Collections中可以直接使用的集合类有:
1)ArrayList
实现了接口:IList、ICollection、IEnumerable
只要集合未被修改,ArrayList 就可安全地同时支持多个读取器
随着向 ArrayList 中添加元素,容量通过重新分配按需自动增加(2倍增加)
如果需要建立一个对象数组,但不能预先知道数组的大小,就可以使用ArrayList
ArrayList把所有元素都当作object对象引用,因而在访问ArrayList的元素时要进行类型转换
优点:动态改变大小、灵活方便的插入和删除元素、可排序
缺点:插入时性能不如数组、不是强类型的

2)BitArray
实现了接口:ICollection、IEnumerable
管理位值的压缩数组。

3)Hashtable
实现了接口:IDictionary、ICollection、IEnumerable
可以向Hashtable中自由添加和删除元素,有些像ArrayList,但没有那么大的性能开销

4)SortedList
实现了接口:IDictionary、ICollection、IEnumerable
SortedLIst兼顾了ArrayList和Hashtable的优点,可按键值来排序

5)Queue
实现了接口:ICollection、IEnumerable
Queque是队列,先进先出的访问各个元素
可以调用Queque对象的GetEnumerator()方法,得到IEnumerator对象,来遍历队列中的各个元素

6)Stack
实现了接口:ICollection、IEnumerable
Stack是堆栈,后进先出的访问各个元素
可以调用Stack对象的GetEnumerator()方法,得到IEnumerator对象,来遍历堆栈中的各个元素


3.上面提到的几种集合类,他们都是通用的集合类,他们所接受的元素大都是Object类型,当对象放入
了集合之后,都失去了原有的类型信息-即这些通用集合类都不是强类型的
解决办法是使用强类型的集合类
System.Collections命名空间下的CollectionBase,DictionaryBase,ReadOnlyCollectionBase 类
System.Collections.Specialized命名空间下的一些类可以满足要求,可以直接使用也可以继承 


面向对象编程的有关定义实在是太多了,搞得不知道从何下手。
我现在的疑问是能够冒出DropDownList.Items.add() 中的add()方法 的 依据从何而来? --------------------编程问答-------------------- --------------------编程问答-------------------- 依据微软定义的 微软弄了一套和C++不一样的语言 叫C# C#里 就用ADD来添加ITEM --------------------编程问答-------------------- 你既然知道IList接口,咋就没去看看IList接口下都有啥方法来着??
Add其实就是IList接口下的方法。 --------------------编程问答-------------------- DropDownList.Items 的items 实际是ListItemCollection对象

而ListItemCollection类则继承并实现了Ilist接口,而Ilist接口下就有add方法

public sealed class ListItemCollection : IList, ICollection, IEnumerable, 
IStateManager
--------------------编程问答--------------------
引用 4 楼 wanghui0380 的回复:
DropDownList.Items 的items 实际是ListItemCollection对象

而ListItemCollection类则继承并实现了Ilist接口,而Ilist接口下就有add方法

public sealed class ListItemCollection : IList, ICollection, IEnumerable, 
IStateManager


谢谢!得到了我想要的答案,我是菜鸟学得不够广和深,因为我目前还没有学到接口,只是大概意识到add()应该是通过继承得到的。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,