2009-01-12 19 views
11

Estaba algo sorprendido por esto. ¿Alguien podría explicar por qué funciona esto? Un buen ejemplo de cuándo usarlo también sería bueno.implementar una interfaz con un método privado en vb.net

Public Interface IFoo 
    Sub DoIt() 
End Interface 

Public Class Bar 
    Implements IFoo 

    Private DoIt() implements IFoo.DoIt 
End Class 

... 

Dim b as new Bar() 
b.DoIt() 'error 
CType(b, IFoo).DoIt() 'no error 
+1

¿Entonces ese código funciona? Estoy sorprendido. Parece muy contrario a la idea de una interfaz. – jcollum

Respuesta

11

Tener una implementación de interfaz privada básicamente solo le permite implementar una interfaz sin tener que enturbiar la API de su clase. Puede implementar IFoo, pero solo las API que lo tratan como IFoo necesitan saberlo.

MSDN dice

Se puede utilizar un miembro privado para implementar un miembro de interfaz. Cuando un miembro privado implementa un miembro de una interfaz, ese miembro se vuelve disponible a través de la interfaz a pesar de que no está disponible directamente en las variables de objeto para la clase.

6

me especie de sorprendida por esto. ¿Alguien podría explicar por qué funciona esto? Un buen ejemplo de cuándo usarlo también sería bueno.

Este concepto es más o menos análogo a la implementación de interfaz explícita de C#. Allí, también, solo puede acceder al miembro de la interfaz si transfiere el tipo explícitamente a esa interfaz.

No puedo hacer un comentario sobre por qué el equipo de .NET framework consideró que esta función era realmente necesaria. A veces puede fortalecer la encapsulación, pero no estoy seguro de esto. En cualquier caso, algo extremadamente similar siempre sería posible usando composición en lugar de herencia (interfaz).

+0

Cuando el miembro es "privado", cumple la misma función que la implementación de interfaz explícita de C# y básicamente tiene la misma semántica (una C explícita sería equivalente a una implementación privada de estilo vb con un nombre privado aleatorio único). El gran beneficio para el enfoque de vb se produce cuando se implementan interfaces con las funciones 'Protegidas Anulables'. Las clases derivadas pueden implementar la interfaz en términos de la implementación del padre, algo que no es posible en C# sin agregar un nivel de indirección extraño. – supercat

2

La primera parte de la pregunta se cubrió en otras publicaciones, pero no vi un ejemplo. Comúnmente uso esto al implementar interfaces genéricas y sus contrapartes no genéricas. Por ejemplo, si quiero hacer una ObservableList genérica, me gustaría implementar ambas interfaces IList.

Public Class ObservableList(Of T) 
    Implements INotifyCollectionChanged, 
       IList, 
       IList(Of T) 
End Class 

Cuando se implementan ambos ILists, terminamos con muchas funciones duplicadas. Algunos comparten la misma firma y pueden implementar ambas funciones IList como Clear. Pero algunas de las funciones no genéricas se ocupan de objetos en lugar de genéricos. Por lo tanto, para la función Agregar, haría que ambas implementaciones funcionaran, pero configuraría la versión no genérica como privada para facilitar el uso de la clase.

Public Sub Add(item As T) Implements System.Collections.Generic.ICollection(Of T).Add 
    'Add item to collection 
End Sub 

Private Function Add1(item As Object) As Integer Implements System.Collections.IList.Add 
    'Add item to collection 
End Function 

De esta manera, la clase se puede pasar y se utiliza como un IList, pero un codificador llega a utilizarlo como un IList (Of T) sin el desorden potencial sobrecarga.

Cuestiones relacionadas