После ограничения области действия установщика и последующего применения интерфейса область действия игнорируется!

StackOverflow https://stackoverflow.com/questions/517049

Вопрос

Если я установлю область на уровне друга для установщика, вот так...

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 и посмотрите, что он по-прежнему доступен через интерфейс!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top