父创建子对象

时间:2014-01-23 12:58:05

标签: vb.net parent-child

我正在编写一个包含Reactor和Zone对象的应用程序。每个Reactor都有可变数量的区域,并将它们存储在名为_zones的私有字段中。

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

以下是示例代码:

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

我的问题是:由于每个区域都需要将一个反应堆传递给它的构造函数,你认为这两种方法中的哪一种更好:

  1. 仅使用Reactor中的方法创建区域。

    Public Class Reactor
        Private _zones As New List(Of Zone)
    
        Public Sub CreateZone()
            _zones.Add(New Zone(Me))
        End Sub
    End Class
    
  2. 创建区域并将它们添加到反应堆

    Public Class Reactor
        Private _zones As New List(Of Zone)
    
        Public Sub AddZone(ByVal z As Zone)
            _zones.Add(z)
        End Sub
    End Class
    
  3. 我认为所选择的选项取决于具体情况,但我想知道其中一个选项是否通常被视为最佳实践。此外,任何有关类似案件的经验都非常有用。

    谢谢!

1 个答案:

答案 0 :(得分:1)

我想说第一个选项是首选。第二种方法的问题是可以创建Zone,在其构造函数中赋予它reactorA,然后将其添加到reactorB。或者,您可以将相同的Zone添加到两个不同的Reactor对象中。您当然可以为此添加错误检查,并在不匹配的情况下抛出异常,但只要设计需要父/子关系,您就永远不可能处于需要创建的位置Zone,但您无法访问其Reactor。只要您在需要创建Reactor时可能始终可以访问Zone,那么就没有理由不通过在{{中添加“create”方法来封装它。 1}}类。

例如,我创建了一个网格对象,它定义了要打印到页面或屏幕的网格表。它包含行列表,每行包含一个单元格列表。这些行需要一个引用回到它们的网格,并且单元格需要一个引用回到它们的行。所以,我只是以一种方式实现它,你告诉网格你要添加一行并给它大小,如下所示:

Reactor

myGrid.Rows.Add(100) 方法返回Row对象,因此您可以像这样轻松地获取它:

Add

这种设计非常适合这种特殊情况。因为我不太可能需要在一个我不会引用父网格的地方创建一行,所以它很容易使用。

如果您遇到需要能够独立创建Dim row As GridRow = myGrid.Rows.Add(100) row.PenWidthTop = 1 个对象,然后再将其添加到Zone的情况,您可以随时将其添加为辅助选项。没有任何关于第一种方法阻止您在以后添加第二种方法。例如,您可以使Reactor个对象允许自己在没有父Zone的情况下创建,然后,当它们被添加到Reactor时,Reactor可以在Reactor上设置一个属性,告诉它父亲Zone是谁。你可以让Reactor类的ParentReactor属性抛出一个例外,如果你之前已经设置了它就试着改变它,如下所示:

Zone