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的要求是:
只能由Order类实例化。
必须是公共的,以便任何其他对象可以通过Order对象访问它的属性/方法。例如Order.OrderItem(0).ProductID。
OrderItem应该能够传递到将对其进行操作的其他子/函数。
我如何实现这些目标?有更好的方法吗?
答案 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
OrderItem
对象来实例化Order
。Order.OrderItem(0).ProductID
)。答案 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
列表。