Способ 1: Продолжить использование инкапсуляции и переадресации вызовов в реализацию списка.
class SomeObject
{
}
class MyEnum : IEnumerable<SomeObject>
{
private List<SomeObject> _myList = new List<SomeObject>();
public void Add(SomeObject o)
{
_myList.Add(o);
}
public IEnumerator<SomeObject> GetEnumerator()
{
return _myList.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return this.GetEnumerator();
}
}
class Program
{
static void Main(string[] args)
{
MyEnum a = new MyEnum();
a.Add(new SomeObject());
foreach (SomeObject o in a)
{
Console.WriteLine(o.GetType().ToString());
}
Console.ReadLine();
}
}
Метод 2: Наследовать от реализации списка вы получите, что поведение бесплатно.
class SomeObject
{
}
class MyEnum : List<SomeObject>
{
}
class Program
{
static void Main(string[] args)
{
MyEnum a = new MyEnum();
a.Add(new SomeObject());
foreach (SomeObject o in a)
{
Console.WriteLine(o.GetType().ToString());
}
Console.ReadLine();
}
}
Метод 1 позволяет лучше песочницу, так как не существует метода, который будет вызываться в список без MyEnum знаний. Для наименьших усилий Способ 2 является предпочтительным.
Хорошо, это будет работать, но я хочу быть уверенным, что вызывающий код не в состоянии типа литья перечислитель перечислит снова и добавит или удалит из него объекты. – Willem 2008-09-24 09:23:46