Método 1: Continuar utilizando encapsulación y reenviar llamadas a la implementación de la lista.
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();
}
}
Método 2: Heredar de implementación de la lista se obtiene que el comportamiento de forma gratuita.
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();
}
}
Método 1 permite una mejor caja de arena ya que no hay método que se llama en la lista sin el conocimiento MyEnum. Por el menos esfuerzo Se prefiere el método 2.
Ok, esto va a funcionar, pero quiero estar seguro de que el código de llamada es incapaz de encasillamiento el enumerador a Enumerar nuevamente y agregar o eliminar objetos de él. – Willem