Vb.net 父对象创建子对象

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

我正在编写一个包含Reactor和Zone对象的应用程序。每个反应堆都有不同数量的分区,并将其存储在一个名为_zones的私有字段中

反过来,每个区域必须知道它属于哪个反应堆,所以它在一个私有字段中存储一个指向其反应堆的指针。我通过将reactor对象传递给区域构造函数来分配此字段

以下是示例代码:

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
我的问题是:因为每个区域都需要有一个反应堆传递给它的构造函数,这两种方法中哪一种你认为更好?
  • 仅使用Reactor中的方法创建分区

    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
    

    你们涵盖了我所想的每一个方面,以及如何获得一个带或不带指定主反应堆的区域,用于测试目的。谢谢