0

私はVB.NETを使用していますが、この質問はすべてのオブジェクト指向言語(Java、C#など)に適用されます。質問にJavaとC#のタグを付けましたが、適切でないと見なされた場合は削除します。

属性の1つとしてClassAAAへの参照を含むエンティティクラスがあります。ClassBBB

Public Class ClassAAA

    Private Property _blah As ClassBBB = Nothing
    Private Property _somethingElse As String
    Private Property _anotherthing As String

    ' Make it private so cannot instantiate class without supplying ClassBBB '
    Private Sub New()
    End Sub

    Public Sub New(ByRef value As ClassBBB)
        _blah = value
    End Sub

    Public Property ImportantAttribute As String
        Get
            Return _blah.Imp
        End Get
        Set(ByVal value As String)
            _blah.Imp = value
        End Set
     End Property

      ' other stuff '
End Class

ClassBBBエンティティクラスの外部に公開したくありません。これが私の質問です。更新を実行したいのですが、使用したいClassAAA静的/共有更新メソッドがありClassBBBます。これを行うための最良の方法は何ですか?

Public Shared Sub UpdateClassAAA(byRef value as ClassAAA)

   ' XXX Cannot do this because ClassBBB reference is private XXX '
    ClassBBBDAO.update(value._blah)

    ' Do other updates on other ClassAAA attributes '

End Sub

ClassBBB参照を公開する(または公開ゲッターメソッドを提供する)ことはできますが、それによっての内部動作が明らかになりClassAAAます。

私が考えているのは、アセンブリ、つまりデータレイヤーでのみ表示され、クライアントプロジェクトでは表示されないようにClassBBB参照を作成することです。Friendしかし、これはまだ私がクラスの内部の仕組みを公開しているように感じます。

これに対するより良いアプローチはありますか?

4

3 に答える 3

3

簡単なアイデアは、内部 ClassAAAにpublic updateメソッドを作成し、他のクラスにオンデマンドで呼び出させることだと思います。このようにして、の内部の詳細を公開するのではなくClassAAA、他の人が必要な機能をアクティブ化できるようにします。

于 2012-04-24T12:15:10.920 に答える
2

ClassAAA非表示にしてカプセル化する場合ClassBBBは、内部で更新するClassAAAためのパブリックメソッドが必要です。ファサードデザインパターンは、問題の解決策をエレガントな方法で示す優れた例ですClassBBB

于 2012-04-24T12:18:44.243 に答える
1

ClassBBBメンバーのゲッターを作成するか、updateメソッドを静的ではなくクラスメソッドにするだけでよいと思います。

于 2012-04-24T12:14:33.493 に答える