【问题标题】:Confused about object relationships对对象关系感到困惑
【发布时间】:2018-03-05 11:48:26
【问题描述】:

在面向对象编程中,我们有使用,has-a,is-a 关系。我想知道地球和太阳是什么关系,地球绕着太阳转?

学习面向对象分析、设计和编程的最佳方式是什么?

【问题讨论】:

  • 添加另一个对象:“太阳系”,然后你就得到太阳系有行星(地球、火星、冥王星等)和恒星(太阳)
  • 但是恒星和行星之间的关系,尤其是太阳和地球之间的关系是什么?
  • 在我的例子中没有。问题是你想要实现什么。如果您想粗略地计算轨道,您将添加一个“行星使用恒星”,如果行星知道它围绕它旋转的恒星,则可以计算出稳定的轨道。事先没有目的地创建对象关系是没有意义的。首先考虑您的目标并根据需要创建对象层次结构。对于每个层次结构,都可能找到一个不适合的新“示例”......
  • 我想在太阳系外进行模拟,我该怎么做呢?我应该学什么?我很困惑

标签: oop object modeling


【解决方案1】:

对象、类和is-a关系

在您的面向对象领域模型中有两个主要对象:

  • Planet 类的对象 Earth(实例化,is-a)
  • Star的对象Sun(实例化,is-a)
  • PlanetStarCelestialObject 的特殊类型(专业化,is-a)

类和对象的关联

SunEarth 之间存在关联:Earth 围绕 Sun 旋转,被其重力捕获。

如果我们从更一般的角度考虑,任何Star 都可能有几个Planet 旋转。它也可能根本没有Planet。相反,大部分Planet 围绕一个Star 旋转。尽管最近的发现已经证实在极少数情况下Planet 可能与多个Star 相关联,但现在让我们保持简单。

这样的关联有两个角度:从Planet我们可以说has-a-Star,从明星方面我们可以说has-a-Planet

如何表示对象世界中的关联?

表示has-a 关联的一种简单方法是保留对关联对象的引用。这仅适用于单数关联,例如对象Earth 将保留对Sun 的引用。

另一种表示has-a 关联的方法是保存一个对关联对象的引用列表(更一般地,一个容器)。然后Sun 将有一个由VenusEarthMars 等组成的关联Planet 列表...

有时,关联可能更复杂,并且包含一些对其所代表的链接唯一的数据。例如,EarthSun 相关联,它会在 365,25 天后周转。为简单起见,您可以认为它是太阳系中Planet 的一个属性。但如果我们认真对待这一点,这个持续时间实际上并不是Earth 的属性,因为Earth 也围绕银河系中心转动,但持续时间不同。它也不是Sun 的属性,因为Mars 也围绕Sun 转动,但在686,96 天后。

在这种情况下,您可以认为关联本身就是一个类。如果它是一个轨道持续时间为 365,25 天的对象,并且具有 - 第一个末端 Sun 和第二个末端 Earth,则为实例化

更多关于这些核心概念的信息

要以独立于语言的方式了解更多关于这些核心概念的信息,您可以查看UML class diagram。它的目的是准确地表示这些类型的概念。你也可以看看this blog,它提供了一个很好的天体类对象,尽管它没有解决关联问题。

如何在仿真中使用模型?

您需要选择一种 OO 语言来实现您的模型。保持一个容器的天体。每个对象都应该有一些坐标、一个旋转速度,以及一个根据其旋转速度和经过的时间更新坐标的方法。然后,您的模拟将包含一个循环(表示经过的时间),并且在每次迭代中,您将遍历您的天体列表,并为每个天体更新坐标,并显示结果。

【讨论】:

  • 感谢克里斯托夫的帮助。你能推荐一本面向对象思维的书吗?
  • 我喜欢 Grady Booch 的面向对象分析和设计(现在可能有点过时)和 Martin Fowler 的 UML。或者“head first”合集中的OO书,读起来更有趣。
猜你喜欢
  • 2020-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
  • 2015-11-29
  • 2015-05-09
  • 2019-11-19
  • 2017-10-10
相关资源
最近更新 更多