Я не могу найти ответ на свой вопрос, поэтому я прошу нового.Лучший способ открыть объект только для чтения
У меня есть объект, где я хочу заполнить его свойства из другого класса в том же решении. Но объект должен раскрывать свойства только для чтения, чтобы внешний вызывающий абонент не мог видеть и не обращаться к настройщику (потому что нет сеттера).
Каков наилучший способ заполнения внутренних опорных переменных из того же решения? Я знаю, что могу сделать это в конструкторе, но я хочу, чтобы иметь возможность устанавливать переменные после создания объекта.
Извините за мое странное объяснение, может быть, немного кода может помочь.
Это то, что я делаю сейчас:
Public Class ReadonlyObject
Protected Friend Sub New()
End Sub
'Could use this, but don't want to...
Protected Friend Sub New(foo As String)
End Sub
Friend _foo As String
Public ReadOnly Property Foo As String
Get
Return _foo
End Get
End Property
End Class
Public Class FillReadonlyObject
Private Sub DoSomeHeavyWork()
Dim roObject As New ReadonlyObject
roObject._foo = "bar"
'Could use this, but don't want to...want to access properties directly.
Dim roObject2 As New ReadonlyObject("bar")
End Sub
End Class
При этом некоторые свойства ReadonlyObject в правильно выставлены как неизменяемые, но я боюсь, что это плохая практика.
Я видел реализаций, как это:
Public Class ReadonlyObject
Protected Friend Sub New()
End Sub
Private _foo As String
Public Property Foo As String
Get
Return _foo
End Get
Friend Set(value As String)
_foo = value
End Set
End Property
End Class
Public Class FillReadonlyObject
Private Sub DoSomeHeavyWork()
Dim roObject As New ReadonlyObject
roObject.Foo = "bar"
End Sub
End Class
Это работает, но предоставляет свойство с легавой. Это недоступно, но это видно, и я не хочу этого :)
Так что, может быть, это всего лишь косметическая штука, но я думаю, что приятно сообщить вызывающему (или, по крайней мере, intellisense), свойство строго для чтения.
Спасибо, Ян
Единственный вопрос, который приходит мне на ум: * почему *? Вы хотите изменить значение свойства, есть три решения: a) конструктор или любой другой метод принимает значения свойств в качестве параметров; b) свойство имеет сеттер или c) вы изменяете переменную-член за свойством, в случае чего с собственностью не имеет смысла в первую очередь. –
Так как насчет Частного сеттера вместо Друга? –
Тогда он не может установить свойство из других классов в проекте. –