作者knifehandz (手刀)
看板C_Sharp
标题Re: [问题] List<T> 观念问题
时间Sat Nov 5 05:53:41 2011
这有点历史问题...
先说明 IList 是个介面 (Interface),所以不算继承,只算实作。
最原始的 List 其实叫做 ArrayList,从 .NET 1.0 就有了,是在 System.Collections
里面;那时的 ArrayList 其实就是一个只能容纳 object 的类别,模仿取代 C 时代
的指标 list 而已。
现在用的 System.Collections.Generic 中的 List 其实是有 generics 後的版本,
可以指定该 List 的资料型别,用於取代原本只能使用 object 的 ArrayList。
但是原型上这两个是应该通用的,所以说 List 必须继承 IList,以便有使用到 IList
介面宣告时可以相容新的 List。
原 PO 所说的 Add(object item),其实就是 IList 的实作,如果不想处理相关的新增
动作,直接 throw new NotImplementedException("Non-generic list not supported")
就好,但如果要实作则建议做型别判断,如:
public int Add(object item) {
if (item is int) {
// 对 int 做转换动作
} else if (...) {
} else {
throw new NotSupportedException("Data type not supported.");
}
}
(上例为 c#)
正确使用上如果有人使用你继承 List 的类别,名为 MyInheritedList,宣告为
public class MyInheritedList : IList<int>, IList, ... (後面省略)
他可以这样用:
IList myList = new MyInheritedList();
myList.Add(12345);
而不会出现错误
或是他也可以这样用:
IList<int> myList = new MyInheritedList();
myList.Add(12345);
当然也可以用其他型别/类别解释,不过大同小异 - 会要求有 Add(object item) 纯粹
是历史问题。
附上 MSDN 做参考:
List<T> -
http://msdn.microsoft.com/en-us/library/6sh2ey19.aspx
ArrayList -
http://msdn.microsoft.com/en-us/library/system.collections.arraylist.aspx
IList.Add 方法 -
http://msdn.microsoft.com/en-us/library/system.collections.ilist.add.aspx
小弟第一次回应文,还请各位先进多多指正,谢谢!
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 124.120.81.102
1F:推 party100046:List<T> 用在动态新增也可以唷 11/05 19:29
2F:→ knifehandz:嗯,ArrayList 跟 List 最大用处其实就是动态阵列 11/06 04:29