【问题标题】:What's the best way to allow my child class access to it's parents information?让我的孩子班级访问其父母信息的最佳方式是什么?
【发布时间】:2012-03-06 20:10:33
【问题描述】:

这是我目前的班级结构。

玩家现在需要一些关于 GUI 和表格的信息。我怎样才能做到最好?

  • 使表格静态? (永远只有一张桌子)
  • 在 player 的构造函数中传递桌子的实例和对应的座位?
  • 将玩家的每个方法所需的数据作为参数传递?

如果可能,我想避免重组我的代码以包含中间类或类似的东西。在这一点上,这将是一个很大的努力。谢谢:)


编辑: 只是为了澄清,因为我的图表是废话。 GUI 包含一个桌子实例,桌子包含十个座位,每个座位可能包含或不包含玩家。没有使用继承。

【问题讨论】:

  • 这将是一个 UML 类图,这意味着 Seat 继承自 Player,Table 继承自 Seat,GUI 继承自 Table。但是 x1/x10 看起来更像是 ER 图中的基数(每桌 10 个座位,每个 GUI 1 个桌,?玩家-座位关系)?但是你说的是childsparents。谁是谁的孩子?将表设为静态意味着每个 JVM 一个表——而不是每个 GUI/JFrame,这在比较并行播放的不同策略时可能会很有趣。使某些东西静态化通常是对遥远未来的限制。
  • @userunknown GUI 包含一个桌子实例,桌子包含十个座位,每个座位可能包含也可能不包含玩家。没有使用继承。

标签: java class parent-child


【解决方案1】:

我会选择第二个选项,在玩家的构造函数中传递一个桌子的实例和对应的座位。

【讨论】:

  • 如何保持表实例的副本同步?如果我要这样做,我需要更新所有 1-11 个,不是吗?添加座位实例,我的程序看起来不再很OO了。
  • 对不起,我迟到了。您不需要更新所有表实例。它们将自动更新。如果您正在使用一些线程,则需要在方法中添加“同步”,以使表值可能发生变化。
【解决方案2】:

如果我理解你在做什么,我会认为 GUI 会有一个桌子的实例,一个桌子会有一个座位数组,玩家将被分配到桌子拥有的座位数组中的一个位置.桌子可以有公共方法来向玩家提供玩家可能需要的关于桌子和座位阵列中的其他玩家的信息。 GUI 可以通过桌子、座位和玩家类中的公共方法向玩家提供有关桌子和所有玩家的信息。我真的不明白桌子、座位和播放器如何成为 GUI 的子类,因为我认为 GUI 是一个 GUI,除了显示和提供用户输入方式之外没有其他功能。

【讨论】:

  • 除非桌子是静态的,否则玩家将如何访问桌子的公共方法?
  • Seat 类有一个玩家的实例作为成员,Table 类有,例如,一个 Seat 对象数组作为成员,Player 类有一个对玩家的表的引用坐在。 Player 类持有的对 Table 的引用可用于访问 Table 类的公共方法。这是如何从 Player 类调用 Table 类的公共方法的简单示例。
  • 我将如何对表格进行引用?因为创建实例会创建一个不会保持最新的副本,不是吗?
  • 简单示例。 Player 类有一个名为“playersTable”的 Table 成员,当您创建或添加一个 Player 对象到 Table at the Table 的 Seat 时,您可以在 Player 构造函数中传入对玩家所在的 Table 的引用或使用Player 类上的一个方法,用于设置对 Table 的引用。例子; Player.setPlayersTable(table) 其中“table”是已经创建的 Table 类的一个实例。然后玩家可以使用引用来调用表的公共方法,像这样,playersTable.getPlayerName(seatNumber) 来获取特定座位上的玩家的名字。
【解决方案3】:

如果 Player 扩展了 Seat,Seat 扩展了 Table,Table 扩展了 GUI,那么 Player 应该可以访问其父级中包含的所有(公共)信息。这就是面向对象(OO)编程的基本思想。

从长远来看,将 Table 设为静态可能会对您造成伤害。如果将您的代码重构为上面建议的内容太困难,那么我建议您使用第二个要点(将 Table 和 Seat 传递给 Player 的构造函数)。

【讨论】:

  • 抱歉,我想我把图表弄错了。我已经更新了这个问题。没有使用继承。
  • 看来继承正是你所需要的。您是否尝试过重构您的域对象,以便它们相互扩展,就像它们在图中所做的那样?通常最好按照你在纸上看到的那样来实现你的代码。
  • 存在一个潜在问题。我希望播放器类尽可能轻量级,因为我可能会将其实例保存到 SQL 数据库或使其在以后的更新中可打包。这可能有点矫枉过正,所有玩家类需要的只是它上面的桌子和座位实例中的一两个整数。
  • 扩展您的基类仍然没有什么坏处。扩展不会使 Person 变得“更重”(取决于您的超类中包含多少数据),并且就保存而言,您只需要根据需要将项目保存在 Person 中。您甚至可以选择保存 Person 超类中的项目,因为您将获得可用的参考。我一直认为最好按照在纸/白板上看到的方式来设计代码。从您的图片来看,在我看来,您将对象设想为具有父/子关系,那么为什么不在您的代码中做同样的事情呢? :)
【解决方案4】:

使玩家需要保护的字段。这将允许玩家访问表格和 GUI 的信息。

【讨论】:

  • 抱歉,我的图表可能看起来具有误导性。我没有使用继承。我应该有吗?
【解决方案5】:

我最终只是将玩家需要的数据作为参数传递给它的方法。我肯定是想多了,因为我只有少量数据要传递。如果需要的数据更广泛,请查看其他答案之一。

这是我的表类中的一个示例方法,它通过调用需要这些变量的 Players 方法之一将它自己的两个变量和一个座位变量传递给 Player 类。

seats[j].getPlayer().raise(raised, seats[j].getPosition(), inPlaySeats);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多