首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >父创建子对象

父创建子对象
EN

Stack Overflow用户
提问于 2014-01-23 12:58:05
回答 1查看 1.3K关注 0票数 2

我在写一个有反应堆和区域对象的应用程序。每个反应堆都有可变数量的区域,并将它们存储在一个名为_zones的私有区域中。

反过来,每个区域都必须知道它属于哪个反应堆,因此它在一个专用的领域中存储了一个指向其反应堆的指针。我通过将一个反应堆对象传递到区域构造函数来分配这个字段。

下面是示例代码:

代码语言:javascript
运行
复制
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. 仅使用反应堆中的方法创建区域。 公共级反应堆专用_zones作为新列表(区域)公共子级CreateZone() _zones.Add(新区(Me))
  2. 创建区域并将它们添加到反应堆中 公共级反应堆专用_zones作为新列表(区域)公共子级AddZone(ByVal z作为区域) _zones.Add(z)末端子类

我认为所选择的方案取决于具体情况,但我想知道这些选择之一是否普遍被视为最佳做法。此外,任何有关类似案件的经验都将非常有用。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-23 13:27:00

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

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

代码语言:javascript
运行
复制
myGrid.Rows.Add(100)

Add方法返回Row对象,因此您可以像这样轻松地获得它:

代码语言:javascript
运行
复制
Dim row As GridRow = myGrid.Rows.Add(100)
row.PenWidthTop = 1

这种设计在那种特殊情况下效果很好。由于我不太可能需要在一个没有引用父网格的地方创建行,这使得它更容易使用。

如果遇到需要独立创建Zone对象的情况,然后稍后将它们添加到Reactor中,则始终可以将其添加为次要选项。关于第一个方法,没有什么可以阻止您在以后添加第二个方法。例如,您可以使Zone对象允许在没有父Reactor的情况下创建自己,然后,当它们被添加到Reactor时,Reactor可以在Zone上设置一个属性,以告诉它它的父Reactor是谁。如果在前面已经设置了ParentReactor属性之后尝试更改它,则可以让Zone类上的Zone属性抛出一个异常,如下所示:

代码语言:javascript
运行
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21308881

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档