对象、类和is-a关系
在您的面向对象领域模型中有两个主要对象:
-
Planet 类的对象 Earth(实例化,is-a)
- 类
Star的对象Sun(实例化,is-a)
-
Planet 和 Star 是 CelestialObject 的特殊类型(专业化,is-a)
类和对象的关联
Sun 和 Earth 之间存在关联:Earth 围绕 Sun 旋转,被其重力捕获。
如果我们从更一般的角度考虑,任何Star 都可能有几个Planet 旋转。它也可能根本没有Planet。相反,大部分Planet 围绕一个Star 旋转。尽管最近的发现已经证实在极少数情况下Planet 可能与多个Star 相关联,但现在让我们保持简单。
这样的关联有两个角度:从Planet我们可以说has-a-Star,从明星方面我们可以说has-a-Planet。
如何表示对象世界中的关联?
表示has-a 关联的一种简单方法是保留对关联对象的引用。这仅适用于单数关联,例如对象Earth 将保留对Sun 的引用。
另一种表示has-a 关联的方法是保存一个对关联对象的引用列表(更一般地,一个容器)。然后Sun 将有一个由Venus、Earth、Mars 等组成的关联Planet 列表...
有时,关联可能更复杂,并且包含一些对其所代表的链接唯一的数据。例如,Earth 与 Sun 相关联,它会在 365,25 天后周转。为简单起见,您可以认为它是太阳系中Planet 的一个属性。但如果我们认真对待这一点,这个持续时间实际上并不是Earth 的属性,因为Earth 也围绕银河系中心转动,但持续时间不同。它也不是Sun 的属性,因为Mars 也围绕Sun 转动,但在686,96 天后。
在这种情况下,您可以认为关联本身就是一个类。如果它是一个轨道持续时间为 365,25 天的对象,并且具有 - 第一个末端 Sun 和第二个末端 Earth,则为实例化
更多关于这些核心概念的信息
要以独立于语言的方式了解更多关于这些核心概念的信息,您可以查看UML class diagram。它的目的是准确地表示这些类型的概念。你也可以看看this blog,它提供了一个很好的天体类对象,尽管它没有解决关联问题。
如何在仿真中使用模型?
您需要选择一种 OO 语言来实现您的模型。保持一个容器的天体。每个对象都应该有一些坐标、一个旋转速度,以及一个根据其旋转速度和经过的时间更新坐标的方法。然后,您的模拟将包含一个循环(表示经过的时间),并且在每次迭代中,您将遍历您的天体列表,并为每个天体更新坐标,并显示结果。