Ich habe eine Klasse, die IEnumerator<string>
implementiert. Siehe unten:
Neben der Tatsache, dass .Current -Eigenschaft sowohl auf der Schnittstelle IEnumerator<T>
als auch auf der Schnittstelle IEnumerator
vorhanden ist (welche IEnumerator<T>
erbt), was bringt es, sie zu implementieren? Wie oben gesehen, wird es nicht einmal aufgerufen.
IEnumerator<T>
implementiert IEnumerator
, also müssen Sie auf der grundlegendsten Ebene den Vertrag erfüllen.
Insbesondere, warum - was passiert, wenn jemand das tut:
%Vor% Sie sollten (normalerweise) erwarten, dass Sie eine lose typisierte Kopie des gleichen Werts / Verweises erhalten, der von IEnumerator<T>
's Implementierung zurückgegeben wurde. Also gib in den meisten Fällen this.Current
zurück und sorge dich nicht darum:)
(FYI - die Rückgabe von this.Current
ist auch eine gute Methode, da sie DRY und SRP folgt - lassen Sie die stark typisierte Version von Current mit den Implementierungsdetails dessen umgehen, was Current tatsächlich ist.)
Der Grund ist, dass IEnumerator<T>
IEnumerator
erbt. Wenn Sie also von IEnumerator<T>
erben, erben Sie implizit auch von IEnumerator
. Wenn Sie eine Schnittstelle ankündigen, sollten Sie auch eine Implementierung für diese Schnittstelle bereitstellen, auch wenn Sie diese nie verwenden möchten.
Der Compiler erfordert, dass Sie alle virtuellen Elemente implementieren, da es möglicherweise nicht wissen kann, welche aufgerufen werden, wenn eine unvorhergesehene Assembly Ihre Assembly irgendwann in der unbekannten Zukunft lädt. Indem Sie von einer Schnittstelle erben, "unterzeichnen Sie einen Vertrag", der verspricht, dass Sie alle seine Mitglieder implementieren werden. Der Compiler hält Sie an dieser Vereinbarung fest, so dass andere Assemblies sich darauf verlassen können.
Der Zweck der Interface-Funktion besteht darin, Ihrer Klasse zu ermöglichen, jeder anderen Assembly zu sagen, wo und wann immer Sie dies tun können. Wenn Sie eine geringere Funktionalität anbieten möchten, definieren Sie eine neue Schnittstelle, die nur die gewünschte Teilfunktionalität bereitstellt, und implementieren Sie diese stattdessen.
Natürlich ist das alles industrielles Zeug. Es ist mehr als Sie jetzt für Ihren Code benötigen. Aber C # soll nützlich sein für ernstes Zeug, nicht nur Spielzeug.
Wie für die zwei verschiedenen, fast identischen Überschreibungen: Sie müssen beide aktuellen Eigenschaften überschreiben, weil sie wesentlich anders sind: Einer ist ein generischer, der T zurückgibt; das andere ist nicht-generisches zurückkehrendes Objekt. Sie können eine String-Referenz immer als Referenz zu Object behandeln, aber das geht nicht in beide Richtungen. Und was ist dann mit Werttypen? T ist nicht gezwungen, eine Klasse zu sein. Sicher, der Compiler könnte hypothetisch alles für Sie herausfinden und Sie in Fällen, in denen die beiden fungibel sind, aus dem Schneider nehmen, aber das tut es nicht, und ich bin nicht überzeugt, dass es sollte. Wenn Sie C ++ wollen, wissen Sie, wo Sie es finden können.
Tags und Links .net c# ienumerator