Pregunta

A menudo tengo que implementar algunas interfaces como IEnumerable<T> en mi código.

Cada vez, al implementar automáticamente, encuentro lo siguiente:

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

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

Aunque tengo que implementar ambos Getenumerator () Métodos, imposiblemente pueden tener el mismo nombre, incluso si entendemos que hacen lo mismo, de alguna manera. El compilador no puede tratarlos como uno la sobrecarga del otro, porque solo el tipo de retorno difiere.

Al hacerlo, logro establecer el GetEnumerator1() accesor private. De esta manera, el compilador no se queja de no implementar el miembro de la interfaz, y simplemente arrojo un NotImplementedException dentro del cuerpo del método.

Sin embargo, me pregunto si es una buena práctica, o si continuaré de manera diferente, como quizás un alias de método o algo así.

¿Cuál es el mejor enfoque al implementar una interfaz como IEnumerable<T> ¿Eso requiere la implementación de dos métodos diferentes con el mismo nombre?

Editar #1

¿VB.NET reacciona de manera diferente a C# al implementar interfaces, ya que en VB.NET se implementa explícitamente, lo que obliga a la GetEnumerator1(). Aquí está el código:

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

Ambas cosas GetEnumerator() Los métodos se implementan explícitamente, y la compilación los negará a tener el mismo nombre. ¿Por qué?

¿Fue útil?

Solución

En Visual Basic, Todas las implementaciones de la interfaz son explícitas.

Las asignaciones de la interfaz se definen por el Implements declaración para que pueda nombrar los métodos de implementación de la interfaz lo que desee. (A diferencia de C#, donde el compilador infiere qué métodos implementan interfaces al igualar sus nombres y firmas).

Cambiar el nombre y la visibilidad del método (según corresponda) es la práctica estándar en VB. Ver Implementación de interfaces en VB.NET Para una buena descripción general.

Otros consejos

Puedes usar Implementación de la interfaz explícita:

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

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

Deberías poder usar Implementaciones de interfaz explícita Para crear los dos métodos que tienen la misma firma. Dependiendo de lo que esté enumerando, solo pasaría estas llamadas a un IEnumerable<T> como una lista o una matriz.

Implementar la interfaz no genérica explícitamente permite que ambos métodos tengan el mismo nombre, y permite que la versión no genérica se implementa en términos del genérico. En la línea de:

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

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top