2013-08-15 4 views
1

Я не могу найти ответ на свой вопрос, поэтому я прошу нового.Лучший способ открыть объект только для чтения

У меня есть объект, где я хочу заполнить его свойства из другого класса в том же решении. Но объект должен раскрывать свойства только для чтения, чтобы внешний вызывающий абонент не мог видеть и не обращаться к настройщику (потому что нет сеттера).

Каков наилучший способ заполнения внутренних опорных переменных из того же решения? Я знаю, что могу сделать это в конструкторе, но я хочу, чтобы иметь возможность устанавливать переменные после создания объекта.

Извините за мое странное объяснение, может быть, немного кода может помочь.

Это то, что я делаю сейчас:

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), свойство строго для чтения.

Спасибо, Ян

+2

Единственный вопрос, который приходит мне на ум: * почему *? Вы хотите изменить значение свойства, есть три решения: a) конструктор или любой другой метод принимает значения свойств в качестве параметров; b) свойство имеет сеттер или c) вы изменяете переменную-член за свойством, в случае чего с собственностью не имеет смысла в первую очередь. –

+0

Так как насчет Частного сеттера вместо Друга? –

+0

Тогда он не может установить свойство из других классов в проекте. –

ответ

1

Если вы хотите явно объявить свойство, как только для чтения, но потом все-таки есть способ, чтобы установить его после того, как он построен, то все, что вам нужно сделать, это создать свой собственный метод установки а не использовать тот, который автоматически создан для вас, но свойство. Например:

Public Class ReadonlyObject 
    Protected Friend Sub New() 
    End Sub 

    Private _foo As String 

    Public ReadOnly Property Foo As String 
     Get 
      Return _foo 
     End Get 
    End Property 

    Friend Sub SetFoo(value As String) 
     _foo = value 
    End Sub 
End Class 

Public Class FillReadonlyObject 
    Private Sub DoSomeHeavyWork() 
     Dim roObject As New ReadonlyObject 
     roObject.SetFoo("bar") 
    End Sub 
End Class 

Или, вы можете создать два свойства, например:

Public Class ReadonlyObject 
    Protected Friend Sub New() 
    End Sub 

    Public ReadOnly Property Foo As String 
     Get 
      Return HiddenFoo 
     End Get 
    End Property 

    Friend Property HiddenFoo As String 
End Class 

Public Class FillReadonlyObject 
    Private Sub DoSomeHeavyWork() 
     Dim roObject As New ReadonlyObject 
     roObject.HiddenFoo = "bar" 
    End Sub 
End Class 
+0

Несомненно, я мог бы это сделать, но почему бы не объявить переменную поддержки как друга и не получить доступ к ней напрямую? Это так плохое поведение? – Jan

+1

@Jan Если вы это сделаете, то почему у вас есть свойство readonly, если вы можете просто обойти его? –

+0

@ Джан, Хорошо, но я бы не рекомендовал напрямую обращаться к полю. Лучше всегда использовать свойства, если сможете. Однако это дало мне еще одну идею, которую я добавил к моему ответу. –

Смежные вопросы