Если я установлю область действия уровня друга на сеттер, как это ...
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. Он полностью игнорирует область Friend!
Это отвратительно. Что мне не хватает ??
Примечание: Мне это нужно, потому что я разрабатываю API, и я хочу, чтобы внутренний API мог устанавливать IsDirty, но конечные разработчики не должны быть в состоянии войти в это. В настоящее время я обертываю весь класс в фасаде, чтобы получить эту функциональность, но фасад должен быть ненужным.