Implementieren Sie eine Schnittstelle, die Erfordert Doppelte Elementnamen?
-
22-10-2019 - |
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?
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();
}
}