реализовать интерфейс с закрытым методом в vb.net - PullRequest
11 голосов
/ 12 января 2009

Я был шокирован этим. Может кто-нибудь объяснить, почему это работает? Хороший пример того, когда его использовать, было бы неплохо.

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

Ответы [ 3 ]

11 голосов
/ 12 января 2009

Наличие частной реализации интерфейса в основном просто позволяет вам реализовать интерфейс, не запутывая API вашего класса. Вы можете реализовать IFoo, но только API, которые относятся к вам как IFoo, должны знать это.

MSDN говорит

Вы можете использовать приватный член для реализации интерфейса. Когда закрытый член реализует член интерфейса, этот член становится доступным через интерфейс, даже если он недоступен непосредственно для переменных объекта для класса.

6 голосов
/ 12 января 2009

Я был шокирован этим. Может кто-нибудь объяснить, почему это работает? Хороший пример того, когда его использовать, было бы неплохо.

Эта концепция в значительной степени аналогична явной реализации интерфейса C #. Там также вы можете получить доступ только к члену интерфейса, если явно приведете тип к этому интерфейсу.

Я не могу комментировать , почему команда .NET Framework сочла, что эта функция действительно необходима. Иногда это может усилить инкапсуляцию, но я не уверен в этом. В любом случае, что-то чрезвычайно похожее всегда возможно с использованием композиции вместо наследования (интерфейса).

2 голосов
/ 12 июля 2012

Первая часть вопроса была освещена в других постах, но я не видел пример. Я обычно использую это при реализации универсальных интерфейсов и их неуниверсальных аналогов. Например, если я хочу создать общий 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) без потенциальной перегрузки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...