usar una puede new net miembro interfaz interfaces implementacion implementa ejemplo diseño vb.net interface

puede - implementar una interfaz con un método privado en vb.net



new no se puede usar en una interfaz (3)

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.

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


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.

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 comentar 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 la composición en lugar de la herencia (interfaz).


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

MSDN dice

Puede usar 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 aunque no esté disponible directamente en las variables de objeto para la clase.


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 forma, la clase se puede pasar y utilizar como IList, pero un programador puede usarla como IList (Of T) sin el potencial desorden de sobrecarga.