После ограничения области действия установщика и последующего применения интерфейса область действия игнорируется!
Вопрос
Если я установлю область на уровне друга для установщика, вот так...
Public Class MyClass
Public Property IsDirty() As Boolean
Get
Return _isDirty
End Get
Friend Set(ByVal trueFalse As Boolean)
_isDirty = trueFalse
End Set
End Property
End Class
...А затем вызовите его из другого проекта, он работает корректно.Я не могу сделать что-то вроде MyClass.IsDirty = True.
Отлично!Это именно то, чего я хочу.
Но теперь, если я определю интерфейс, и мне действительно придется это сделать:
Public Interface IMyClass
Property IsDirty() As Boolean
End Interface
Я могу сделать что-то вроде:
Dim MyInstance as IMyClass= GetSomeInstanceOfMyClass()
MyInstance.IsDirty=True
... И, как ни странно, он бежит! Никаких исключений не генерируется, и внутренней переменной присваивается значение True.Это полностью игнорирует область Друзей!
Это отвратительно.Что я упускаю из виду??
Примечание: Мне это нужно, потому что я разрабатываю API, и я хочу, чтобы внутренний API мог устанавливать IsDirty, но конечные разработчики не должны иметь возможности вникать в это.В настоящее время я оборачиваю весь класс фасадом, чтобы получить эту функциональность, но фасад не должен быть необходимым.
Решение
Методы интерфейса всегда имеют общедоступный доступ.Вы не можете исправить это с помощью явной реализации интерфейса, это скроет только метод класса.Простое приведение объекта к типу интерфейса снова дает неограниченный доступ.
Редактировать:на самом деле, проблему легко решить.Просто объявите свойство только для чтения в объявлении интерфейса :)
Например:
Public Interface IMyClass
ReadOnly Property IsDirty() As Boolean
End Interface
Public Class Test
Implements IMyClass
Private mIsDirty As Boolean
Private ReadOnly Property IsDirtyImpl() As Boolean Implements IMyClass.IsDirty
Get
Return mIsDirty
End Get
End Property
Public Property IsDirty() As Boolean
Get
Return mIsDirty
End Get
Friend Set(ByVal value As Boolean)
mIsDirty = value
End Set
End Property
End Class
Другие советы
Чего вам не хватает, так это концепции неявной реализации интерфейса.Видишь ответ на этот вопрос более подробен.
И если вы считаете, что это отвратительно с настройщиком друзей, попробуйте установить для него значение Private и посмотрите, что он по-прежнему доступен через интерфейс!