对对象关系感到困惑

Confused about object relationships

在面向对象的编程中,我们有 uses、has-a、is-a 关系。请问地球和太阳是什么关系,地球绕着太阳转?

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

对象,classes 和 is-a 关系

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

  • 一个对象Earth of class Planet(实例化,is-a)
  • 一个对象Sun of class Star(实例化,is-a)
  • PlanetStar是特殊的CelestialObject(特化,is-a)

class 对象与对象的关联

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

如果我们更笼统地考虑,任何 Star 都可以有几个 Planet 旋转。它也可能根本没有 Planet。相反,大多数 Planet 围绕着一个 Star 旋转。现在让我们保持简单,尽管最近的发现证实了在极少数情况下 Planet 可能与多个 Star 相关联。

这样的联想有两个方面:从Planet可以说是has-a-Star,从星方面可以说是has-a-Planet

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

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

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

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

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

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

要了解有关这些核心概念的更多信息,并以独立于语言的方式,您可以查看 UML class diagram. It's purpose is to represent exactly these kind concepts. You may also have a look at this blog,它为天体提供了一个很好的 classes 对象,尽管它不涉及协会。

如何在模拟中使用模型?

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