После ограничения области действия Setter и последующего применения интерфейса область действия не учитывается! - PullRequest
0 голосов
/ 05 февраля 2009

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

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

Ответы [ 2 ]

1 голос
/ 05 февраля 2009

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

РЕДАКТИРОВАТЬ: на самом деле проблему легко решить. Просто объявите свойство ReadOnly в объявлении интерфейса:)

Например:

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
1 голос
/ 05 февраля 2009

Чего вам не хватает, так это концепции неявной и явной реализации интерфейса. См. ответ на этот вопрос для получения более подробной информации .

И если вы думаете, что это отвратительно с установщиком друзей, попробуйте установить для него значение Личное и смотреть, как оно по-прежнему доступно через интерфейс!

...