您好我想创建自定义集合,我从CollectionBase类派生我的自定义集合类,如下所示:
public class MyCollection : System.Collectio.CollectionBase
{
MyCollection(){}
public void Add(MyClass item)
{
this.List.Add(item);
}
}
class MyClass
{
public string name;
}
让我问几个问题:
答案 0 :(得分:6)
从List<T>
派生有点无意义,尤其现在它具有IEnumerable<T>
构造函数和扩展方法的可用性。除了Equals
,GetHashCode
和ToString
之外,它没有可以覆盖的虚拟方法。 (如果你的目标是为列表实现Java的toString()功能,我想你可以从List<T>
派生。)
如果要创建自己的强类型集合类并可能在添加/删除项时自定义集合行为,则需要从新的(到.NET 2.0)类型派生System.Collections.ObjectModel.Collection<T>
,受保护的虚拟方法,包括InsertItem
和RemoveItem
,您可以覆盖这些方法以在这些时间执行操作。请务必阅读文档 - 这是一个非常简单的类,但您必须了解public / non-virtual和protected / virtual方法之间的区别。 :)
public class MyCollection : Collection<int>
{
public MyCollection()
{
}
public MyCollection(IList<int> list)
: base(list)
{
}
protected override void ClearItems()
{
// TODO: validate here if necessary
bool canClearItems = ...;
if (!canClearItems)
throw new InvalidOperationException("The collection cannot be cleared while _____.");
base.ClearItems();
}
protected override void RemoveItem(int index)
{
// TODO: validate here if necessary
bool canRemoveItem = ...;
if (!canRemoveItem)
throw new InvalidOperationException("The item cannot be removed while _____.");
base.RemoveItem(index);
}
}
答案 1 :(得分:4)
我认为你最好使用System.Collections.Generic中定义的容器类之一
答案 2 :(得分:3)
如果你想要自己的集合类,你也可以从泛型集合继承到非泛型类,例如:
public class MyCollection : List<MyClass>
{
}
这样您就可以获得列表的所有功能(例如)。你只需要添加一些构造函数。
答案 3 :(得分:1)
为什么不使用通用集合?
using System;
using System.Collections.Generic;
namespace Test {
class MyClass {
}
class Program {
static void Main(string[] args) {
// this is a specialized collection
List<MyClass> list = new List<MyClass>();
// add elements of type 'MyClass'
list.Add(new MyClass());
// iterate
foreach (MyClass m in list) {
}
}
}
}
编辑:Ashu,如果您想对添加和删除操作进行一些验证,您可以使用通用集合作为专门集合的成员:
using System;
using System.Collections.Generic;
namespace Test {
class MyClass {
}
class MyClassList {
protected List<MyClass> _list = new List<MyClass>();
public void Add(MyClass m) {
// your validation here...
_list.Add(m);
}
public void Remove(MyClass m) {
// your validation here...
_list.Remove(m);
}
public IEnumerator<MyClass> GetEnumerator() {
return _list.GetEnumerator();
}
}
class Program {
static void Main(string[] args) {
MyClassList l = new MyClassList();
l.Add(new MyClass());
// iterate
foreach (MyClass m in l) {
}
}
}
}
答案 4 :(得分:0)
也许我在这里遗漏了一些内容,但如果您只是需要添加验证,为什么不从通用集合继承并覆盖New()
Remove()
或任何其他方法。
class CustomeCollection<T> : List<T>
{
public new void Add(T item)
{
//Validate Here
base.Add(item);
}
public new void Remove(T item)
{
//Validate Here
base.Remove(item);
}
}