2013-11-13 3 views
0

Так что у меня есть проблема, в которой у меня есть объект, который содержит другие объекты, которые слабо связаны друг с другом. Я хочу, чтобы этот объект был своего рода репозиторием, в котором переменные могут быть прочитаны, но не изменены, если этот объект используется. Это был мой отправной точкой (VB.Net):.Net Как сделать свойства readonly, когда родительский объект помечен как readonly

Public Class CompanyVendorContext 
    Private _company As ICompany 
    Private _vendor As IVendor 

    Public ReadOnly Property Company As ICompany 
     Get 
      Return Me._company 
     End Get 
    End Property 

    Public ReadOnly Property Vendor As IVendor 
     Get 
      Return Me._vendor 
     End Get 
    End Property 

    Public Sub New(ByVal objCompany As ICompany, ByVal objVendor As IVendor) 
     Me._company = objCompany 
     Me._vendor = objVendor 
    End Sub 
End Class 

Теперь, соответственно, когда я пытаюсь установить сам объект, например, так:

Dim context As New CompanyVendorContext(New Company, New Vendor) 
context.Company = New Company 

Это не позволяет мне сделать это , что идеально. Однако, когда я пытаюсь сделать это, то:

Dim context As New CompanyVendorContext(New Company, New Vendor) 
context.Company.ID = 1 

Это позволяет мне это сделать. Могу ли я установить свойства объекта Company как readonly, но только при доступе к этому объекту CompanyVendorContext?

+0

Недвижимость (единственная) Компания CompanyVendorContext - только для чтения. {Родственностью Компании является то, как все свойства определяются в Компании. – Paparazzi

ответ

0

A ReadOnly имущество только делает эту недвижимость только для чтения; это не влияет на поведение объекта, к которому ссылается свойство. Если вам нужно сделать действительно только для чтения экземпляр вам придется сделать ICompany неизменны, как это:

Public Interface ICompany 
    ReadOnly Property Id() As Integer 
    ... 
End Interface 

Конечно, некоторые уход должны быть приняты здесь. Если Company (класс, который реализует ICompany) изменчив, нет ничего очистных пользователя делать это:

CType(context.Company,Company).ID = 1 
0

вам необходимо установить свойство ID в READONLY также.

0

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

0

Используйте интерфейс, когда вам нужно использовать readonly, как это.

Public Interface ICompanyVendorContext 
    ReadOnly Property Company As ICompany 
    ReadOnly Property Vendor As IVendor 
End Interface 

Public Class CompanyVendorContext Implements ICompanyVendorContext 

    Private m_Company As ICompany 
    Private m_Vendor As IVendor 

    Public Property Company As ICompany 
     Get 
      Return m_AppFolder 
     End Get 
     Set 
      m_AppFolder = Value 
     End Set 
    End Property 

    Public Property Vendor As IVendor 
     Get 
      Return m_Vendor 
     End Get 
     Set 
      m_Vendor = Value 
     End Set 
    End Property 

    private readonly Property ReadonlyCompany As ICompany implements ICompanyVendorContext.Company 
     Get 
      Return m_Company 
     End Get 
    End Property 

    private readonly Property ReadonlyVendor As IVendor implements ICompanyVendorContext.Vendor 
     Get 
      Return m_Vendor 
     End Get 
    End Property 

End Class 
+0

'Company()' в VB будет массивом. –

+0

Я знал это: D. Мои пальцы делали что-то отдельно от моего мозга –

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