Vb.net 父对象创建子对象
我正在编写一个包含Reactor和Zone对象的应用程序。每个反应堆都有不同数量的分区,并将其存储在一个名为_zones的私有字段中 反过来,每个区域必须知道它属于哪个反应堆,所以它在一个私有字段中存储一个指向其反应堆的指针。我通过将reactor对象传递给区域构造函数来分配此字段 以下是示例代码:Vb.net 父对象创建子对象,vb.net,parent-child,Vb.net,Parent Child,我正在编写一个包含Reactor和Zone对象的应用程序。每个反应堆都有不同数量的分区,并将其存储在一个名为_zones的私有字段中 反过来,每个区域必须知道它属于哪个反应堆,所以它在一个私有字段中存储一个指向其反应堆的指针。我通过将reactor对象传递给区域构造函数来分配此字段 以下是示例代码: Public Class Reactor Private _zones As New List(Of Zone) End Class Public Class Zone Priva
Public Class Reactor
Private _zones As New List(Of Zone)
End Class
Public Class Zone
Private _reactor As Reactor
Public Sub New(ByVal reactor As Reactor)
_reactor = reactor
End Sub
End Class
我的问题是:因为每个区域都需要有一个反应堆传递给它的构造函数,这两种方法中哪一种你认为更好?
Public Class Reactor
Private _zones As New List(Of Zone)
Public Sub CreateZone()
_zones.Add(New Zone(Me))
End Sub
End Class
Public Class Reactor
Private _zones As New List(Of Zone)
Public Sub AddZone(ByVal z As Zone)
_zones.Add(z)
End Sub
End Class
谢谢 我认为第一种选择更可取。第二种方法的问题是,可以创建一个
区域
,在其构造函数中赋予它reactorA
,然后将其添加到reactorB
。或者,您可以将相同的区域
添加到两个不同的Reactor
对象。当然,您可以为此添加错误检查,并在不匹配的情况下引发异常,但只要设计需要父/子关系,您就永远不会处于需要创建区域的位置,但您无法访问其反应器。只要在需要创建区域
时,您可能始终能够访问反应器
,那么就没有理由不通过将“create”方法放入反应器
类来封装这一切
例如,我创建了一个网格对象,它定义了一个要打印到页面或屏幕上的网格表。它包含一个行列表,每个行包含一个单元格列表。行需要引用回其网格,单元格需要引用回其行。因此,我只是以一种方式实现了它,您可以告诉网格您想要添加一行并给它指定大小,如下所示:
myGrid.Rows.Add(100)
Dim row As GridRow = myGrid.Rows.Add(100)
row.PenWidthTop = 1
Public Class Zone
Public Sub New()
End Sub
Public Sub New(parentReactor As Reactor)
_parentReactor = parentReactor
End Sub
Private _parentReactor As Reactor
Public Property ParentReactor As Reactor
Get
Return _parentReactor
End Get
Set(value As Reactor)
If _parentReactor IsNot Nothing Then
Throw New Exception("This zone has already been added to a Reactor")
End If
_parentReactor = value
End Set
End Property
' ...
End Class
而Add
方法返回Row对象,因此您可以像这样轻松地获取它:
myGrid.Rows.Add(100)
Dim row As GridRow = myGrid.Rows.Add(100)
row.PenWidthTop = 1
Public Class Zone
Public Sub New()
End Sub
Public Sub New(parentReactor As Reactor)
_parentReactor = parentReactor
End Sub
Private _parentReactor As Reactor
Public Property ParentReactor As Reactor
Get
Return _parentReactor
End Get
Set(value As Reactor)
If _parentReactor IsNot Nothing Then
Throw New Exception("This zone has already been added to a Reactor")
End If
_parentReactor = value
End Set
End Property
' ...
End Class
这种设计非常适合这种特殊情况。因为我不太可能需要在没有父网格引用的地方创建一行,所以这样做很好,也很容易使用
如果您遇到需要能够独立创建区域
对象,然后将其添加到反应器
中的情况,您始终可以将其作为辅助选项添加。对于第一种方法,没有什么可以阻止您在以后添加第二种方法。例如,您可以使区域
对象允许在没有父反应器的情况下创建它们自己,然后,当它们添加到反应器
时,反应器
可以在区域
上设置一个属性,告诉它它是谁的父反应器
。如果在之前设置了异常后尝试更改它,则可以让区域
类上的ParentReactor
属性引发异常,如下所示:
myGrid.Rows.Add(100)
Dim row As GridRow = myGrid.Rows.Add(100)
row.PenWidthTop = 1
Public Class Zone
Public Sub New()
End Sub
Public Sub New(parentReactor As Reactor)
_parentReactor = parentReactor
End Sub
Private _parentReactor As Reactor
Public Property ParentReactor As Reactor
Get
Return _parentReactor
End Get
Set(value As Reactor)
If _parentReactor IsNot Nothing Then
Throw New Exception("This zone has already been added to a Reactor")
End If
_parentReactor = value
End Set
End Property
' ...
End Class
你们涵盖了我所想的每一个方面,以及如何获得一个带或不带指定主反应堆的区域,用于测试目的。谢谢