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.
¿Entonces ese código funciona? Estoy sorprendido. Parece muy contrario a la idea de una interfaz. – jcollum