是否可以将对象的实例化限制为VB.NET中的另一个(父)对象?

时间:2010-04-27 16:23:46

标签: vb.net object instantiation restriction

VB 2008 .NET 3.5

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

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

没有Order就不应该存在OrderItem。换句话说,OrderItem类不应该自己实例化,它应该依赖于Order类来包含它并实例化它。但是,OrderItem应该在范围内是公共的,以便其他对象可以访问它的属性。因此,OrderItem的要求是:

  1. 只能由Order类实例化。

  2. 必须是公共的,以便任何其他对象可以通过Order对象访问它的属性/方法。例如Order.OrderItem(0).ProductID。

  3. OrderItem应该能够传递到将对其进行操作的其他子/函数。

  4. 我如何实现这些目标?有更好的方法吗?

3 个答案:

答案 0 :(得分:4)

您可以创建一个OrderItem的构造函数,其中包含Order项。

在此构造函数中,您可以将OrderItem添加到Order.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可以传递给其他子和函数。

答案 1 :(得分: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

答案 2 :(得分:2)

OrderItem的构造函数应为friend(仅可访问Order) - 我说friend因为使用friend您可以限制其可见性OrderItem对同一程序集中的类的构造函数。 注意:此解决方案意味着Order和OrderItem位于一个库/程序集中,并且您尝试从另一个程序集中使用它们 - 否则friend保护不起作用。

创建OrderItem个对象的责任应仅属于Order

构建类似于Order类的方法:Public Function CreateOrderItem(whateverParametersYouNeed) as OrderItem,在内部实例化新的OrderItem,将其添加到OrderItem列表并返回对新创建的项的引用

然后,您可以使用此OrderItem执行任何操作 - 它将始终属于Order列表。