Frage

Ich habe oft mit der Umsetzung einiger Schnittstellen wie IEnumerable<T> in meinem code.

Jedes mal, wenn die Umsetzung sich automatisch, stoße ich auf Folgendes:

public IEnumerator<T> GetEnumerator() {
    // Code here...
}

public IEnumerator GetEnumerator1() {
    // Code here...
}

Obwohl ich beide implementieren GetEnumerator() Methoden, die Sie unmöglich den gleichen Namen haben, auch wenn wir verstehen, dass Sie das gleiche tun, irgendwie.Der compiler kann nicht behandeln Sie wie ein Wesen der überlastung der anderen, weil nur der Rückgabetyp unterscheidet.

Wenn ich dadurch gelingt es, die GetEnumerator1() accessor private.Dieser Weg, der compiler keine Beschwerde über nicht Umsetzung der interface-Mitglied sind, und ich einfach werfen ein NotImplementedException innerhalb der Methode auf den Körper.

Allerdings Frage ich mich, ob es eine gute Praxis, oder ob ich muss anders Vorgehen, als vielleicht eine Methode, alias oder sowas also.

Was ist der beste Ansatz, während die Implementierung einer Schnittstelle wie IEnumerable<T> das erfordert die Umsetzung von zwei unterschiedlichen Methoden mit dem gleichen Namen?

BEARBEITEN #1

Tut VB.NET reagiert unterschiedlich aus C# - die bei der Implementierung von Schnittstellen, da in VB.NET es ist explizit implementiert, so zwingt die GetEnumerator1().Hier ist der code:

Public Function GetEnumerator() As System.Collections.Generic.IEnumerator(Of T) Implements System.Collections.Generic.IEnumerable(Of T).GetEnumerator
    // Code here...
End Function

Public Function GetEnumerator1() As System.Collections.Generic.IEnumerator Implements System.Collections.Generic.IEnumerable.GetEnumerator
    // Code here...
End Function

Beide GetEnumerator() Methoden werden explizit implementiert, und die Kompilierung wird sich weigern, Ihnen den gleichen Namen haben.Warum?

War es hilfreich?

Lösung

In Visual Basic, alle interface-Implementierungen sind ausdrücklich.

Interface-mappings definiert werden, indem die Implements Anweisung, so können Sie die Namen Ihrer Schnittstelle-Implementierung Methoden, was immer Sie wollen.(Im Gegensatz zu C#, wo der compiler leitet die Methoden der Schnittstelle implementieren, die von übereinstimmenden Ihren Namen und Unterschriften.)

Ändern der name der Methode und die Sichtbarkeit (soweit erforderlich) ist standard Praxis in VB.Finden Implementieren von Schnittstellen in VB.NET für einen guten überblick.

Andere Tipps

Sie können verwenden explizite schnittstellenimplementierung:

IEnumerator IEnumerable.GetEnumerator()
{
    return GetEnumerator();
}

public IEnumerator<T> GetEnumerator()
{
    ...
}

Sie sollten in der Lage sein zu verwenden Explizite Schnittstellenimplementierungen erstellen der beiden Methoden die gleiche Signatur.Je nachdem, was Sie auflisten, ich würde nur passieren diese Anrufe durch, um eine interne IEnumerable<T> wie eine Liste oder ein array ist.

Die Umsetzung der nicht-generische Schnittstelle explizit erlaubt beide Methoden den gleichen Namen haben, und können die nicht generische version umgesetzt werden, die in Bezug auf die generischen.Entlang der Linien von:

public class TestEnumerable : IEnumerable<int>
{
    public IEnumerator<int> GetEnumerator()
    {
        // Type-safe implementation here.
    }

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top