2

VB 2008 .NET 3.5

ある種のオンライン注文システムを表す Order と OrderItem という 2 つのクラスがあるとします。OrderItem は、Order 内の単一の項目を表します。1 つの Order には、List(of OrderItem) の形式で複数の OrderItem を含めることができます。

Public Class Order
    Public Property MyOrderItems() as List(of OrderItem)
    End Property
End Class

OrderItem が Order なしでは存在しないことは理にかなっています。言い換えると、OrderItem クラスはそれ自体でインスタンス化できるべきではなく、それを含んでインスタンス化するために Order クラスに依存する必要があります。ただし、OrderItem のプロパティは他のオブジェクトからアクセスできるように、スコープ内でパブリックにする必要があります。したがって、OrderItem の要件は次のとおりです。

  1. Order クラスによってのみインスタンス化できます。

  2. 他のオブジェクトが Order オブジェクトを介してそのプロパティ/メソッドにアクセスできるようにするには、パブリックにする必要があります。例: Order.OrderItem(0).ProductID.

  3. OrderItem は、それを操作する他のサブ/関数に渡すことができる必要があります。

これらの目標を達成するにはどうすればよいですか? より良いアプローチはありますか?

4

3 に答える 3

4

OrderItemアイテムを取る単一のコンストラクターを作成できOrderます。

このコンストラクターではOrderItemOrder.MyOrderItemsコレクションに を追加できます。

これにより、要件が満たされます。

Public Class OrderItem
    Public Sub New(ByRef myOrder As Order)
        myOrder.MyOrderItems.Add(Me)
    End Sub
End Class
  1. 有効なオブジェクトをOrderItem渡すことによってのみインスタンス化できます。Order
  2. まだ公開されており、必要に応じて呼び出すことができます ( Order.OrderItem(0).ProductID)。
  3. OrderItem は、他のサブルーチンや関数に渡すことができます。
于 2010-04-27T16:29:54.420 に答える
3

これを行う標準的な方法は、OrderItem をインターフェイスとして公開し、それを Order クラス内のプライベート クラスに実装することです。OrderItem クラスは Order クラス内でのみインスタンス化できますが、パブリック IOrderItem インターフェイスを介して外部に公開できます。そのようです:

Public Interface IOrderItem
    ReadOnly Property ItemCode() As Integer
    ReadOnly Property NumberOfItems() As Integer
    ReadOnly Property Description() As String
End Interface

Public Class Order

    Private m_Items As List(Of IOrderItem)

    Public ReadOnly Property Items() As List(Of IOrderItem)
        Get
            Return m_Items
        End Get
    End Property

    Private Class OrderItem
        Implements IOrderItem

        Private m_Code As Integer
        Private m_NumItems As Integer
        Private m_Description As String

        Public Sub New(ByVal code As Integer, ByVal numItems As Integer, ByVal desc As String)
            m_Code = code
            m_NumItems = numItems
            m_Description = desc
        End Sub

        Public ReadOnly Property Description() As String Implements IOrderItem.Description
            Get
                Return m_Description
            End Get
        End Property

        Public ReadOnly Property ItemCode() As Integer Implements IOrderItem.ItemCode
            Get
                Return m_Code
            End Get
        End Property

        Public ReadOnly Property NumberOfItems() As Integer Implements IOrderItem.NumberOfItems
            Get
                Return m_NumItems
            End Get
        End Property
    End Class
End Class
于 2010-04-27T20:17:11.533 に答える
2

OrderItemのコンストラクターはfriend(にのみアクセス可能Order)である必要があります-をfriend使用すると、コンストラクターの可視性を同じアセンブリ内のクラスにfriend制限できるためです。:このソリューションは、OrderとOrderItemが1つのライブラリ/アセンブリにあり、別のアセンブリからそれらを使用しようとしていることを意味します。そうしないと、保護が機能しません。OrderItemfriend

オブジェクトを作成する責任は、以下OrderItemにのみ属する必要がありますOrder

Orderクラスのようなメソッドを作成します。これはPublic Function CreateOrderItem(whateverParametersYouNeed) as OrderItem、新しいを内部的にインスタンス化し、OrderItemそれをリストに追加してOrderItem、新しく作成されたアイテムへの参照を返します。

その後、これを使用して好きなことを行うことができますOrderItem-それは常にのリストに属しOrderます。

于 2010-04-27T16:41:54.057 に答える