2

VB 2008 .NET 3.5

假设我们有两个类,Order 和 OrderItem,它们代表某种类型的在线订购系统。OrderItem 表示订单中的单个行项目。一个 Order 可以包含多个 OrderItem,以 List(of OrderItem) 的形式。

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

没有订单,订单项就不应该存在,这是有道理的。换句话说,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您可以将 的构造函数的可见性限制OrderItem在同一程序集中的类中。注意:此解决方案意味着 Order 和 OrderItem 在一个库/程序集中,并且您正在尝试从另一个程序集中使用它们 - 否则friend保护不起作用。

创建对象的责任OrderItem应该只属于Order

在类上构建一个方法OrderPublic Function CreateOrderItem(whateverParametersYouNeed) as OrderItem在内部实例化一个 new OrderItem,将其添加到OrderItem列表中并返回对新创建项目的引用。

然后你可以用它做任何你想做的事情OrderItem- 它总是属于Order's 列表。

于 2010-04-27T16:41:54.057 回答