0

そのため、互いにゆるく関連している他のオブジェクトを保持するオブジェクトがあるという問題があります。このオブジェクトを、変数を読み取ることができる一種のリポジトリにしたいだけですが、このオブジェクトが使用されている場合は変更されません。これが私の出発点でした(VB.Net):

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 オブジェクトのプロパティを読み取り専用として設定できますか?

4

4 に答える 4

0

プロパティは、そのReadOnlyプロパティ値を読み取り専用にするだけです。プロパティが参照するオブジェクトの動作には影響しません。本当に読み取り専用のインスタンスを作成する必要がある場合はICompany、次のように不変にする必要があります。

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

もちろん、ここでも注意が必要です。Company( を実装するクラス) が変更可能な場合ICompany、ユーザーがこれを行うのを止めるものは何もありません。

CType(context.Company,Company).ID = 1
于 2013-11-13T18:39:16.637 に答える
0

ID プロパティも読み取り専用に設定する必要があります。

于 2013-11-13T18:40:16.187 に答える
0

プロパティの set アクセサーを非公開または保護したくないと仮定すると、Company クラス自体を変更してそのすべてのプロパティを読み取り専用にする (およびその上および下にある) 以外にこれを行う簡単な方法はありません。設計で変更できない場合は、各プロパティのオブジェクトをラップし、それらのプロパティの設定を許可しない、ある種のアダプター、プロキシ、またはその他の関連する設計パターンを作成できます。

于 2013-11-13T18:42:14.457 に答える
0

このように読み取り専用を使用する必要がある場合は、インターフェイスを使用してください。

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
于 2013-11-13T18:52:05.493 に答える