Nehmen Sie die folgende Klasse an:
%Vor%Es ist notwendig, die IEnumerator-Methoden in MyEnum zu implementieren. Aber ist es möglich, die Implementierung für IEnumerator direkt an _myList zu delegieren oder umzuleiten, ohne die IEnumerator-Methoden implementieren zu müssen?
Methode 1: Verwenden Sie weiterhin die Kapselung und leiten Sie Aufrufe an die List-Implementierung weiter.
%Vor%Methode 2: Wenn Sie die List-Implementierung übernehmen, erhalten Sie dieses Verhalten kostenlos.
%Vor%Methode 1 ermöglicht ein besseres Sandboxing, da es keine Methode gibt, die in List ohne MyEnum-Wissen aufgerufen wird. Für den geringsten Aufwand wird Methode 2 bevorzugt.
Sie können dies tun:
%Vor%Der Grund ist einfach. Ihre Klasse kann mehrere Felder enthalten, die Sammlungen sind, so dass der Compiler / die Umgebung nicht wissen kann, welches Feld für die Implementierung von "IEnumerator" verwendet werden sollte.
EIDT: Ich stimme @pb zu - Sie sollten IEnumerator & lt; SomeObject & gt; Schnittstelle.
Abgesehen von der Verwendung der Methode von pb ist dies aus einem "einfachen" Grund nicht möglich: Die Interface-Methode muss einen this
-Zeiger als erstes Argument übergeben bekommen. Wenn Sie GetEnumerator
für Ihr Objekt aufrufen, ist dieser Zeiger Ihr Objekt. Damit der Aufruf an der geschachtelten Liste funktioniert, muss der Zeiger jedoch ein Verweis auf diese Liste und nicht auf Ihre Klasse sein.
Daher müssen Sie die Methode explizit an das andere Objekt delegieren.
(Und übrigens, der Hinweis in der anderen Antwort war richtig: Verwenden Sie IEnumerator<T>
, nicht IEnumerable
!)
Wenn Sie eine Auflistung so zurückgeben möchten, dass der Aufrufer die Auflistung nicht ändern kann, möchten Sie die Liste möglicherweise in eine ReadOnlyCollection & lt; & gt; und gebe IEnumerable & lt; & gt; der ReadOnlyCollection & lt; & gt;.
Auf diese Weise können Sie sicher sein, dass Ihre Sammlung nicht geändert wird.
Nicht, wenn Sie nicht von List & lt; T & gt;.
abgeleitet sind %Vor%Vielen Dank für Ihre Anregungen und Anregungen. Irgendwann habe ich einige Ihrer Antworten mit folgenden kombiniert:
%Vor%Diese Lösung soll sicherstellen, dass der aufrufende Code nicht in der Lage ist, die Liste zu modifizieren, und jeder Aufzähler unabhängig von den anderen in jeder Hinsicht ist (z. B. beim Sortieren). Nochmals vielen Dank.
Beachten Sie, dass Sie dank Duck-Typing % verwenden können. co_de% für jedes Objekt, das eine foreach
-Methode hat - der Objekttyp muss nicht wirklich GetEnumerator
implementieren.
Also wenn du das tust:
%Vor%Dann funktioniert das ganz gut:
%Vor%