Первая часть вопроса была освещена в других постах, но я не видел пример. Я обычно использую это при реализации универсальных интерфейсов и их неуниверсальных аналогов. Например, если я хочу создать общий ObservableList, я бы хотел реализовать оба интерфейса IList.
Public Class ObservableList(Of T)
Implements INotifyCollectionChanged,
IList,
IList(Of T)
End Class
Когда оба ILists будут реализованы, мы получим много дублирующих функций. Некоторые имеют одну и ту же сигнатуру и могут реализовывать обе функции IList, такие как Clear. Но некоторые неуниверсальные функции имеют дело с объектами, а не с универсальными. Поэтому для функции Add я бы заставил обе реализации работать, но установил приватность неуниверсальной версии, чтобы упростить использование класса.
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
Таким образом, класс может быть передан и использован как IList, но кодер может использовать его как IList (Of T) без потенциальной перегрузки.