对对象关系感到困惑
Confused about object relationships
在面向对象的编程中,我们有 uses、has-a、is-a 关系。请问地球和太阳是什么关系,地球绕着太阳转?
学习面向对象分析、设计和编程的最佳方法是什么?
对象,classes 和 is-a 关系
在您的面向对象领域模型中,有两个主要对象:
- 一个对象
Earth
of class Planet
(实例化,is-a)
- 一个对象
Sun
of class Star
(实例化,is-a)
Planet
和Star
是特殊的CelestialObject
(特化,is-a)
class 对象与对象的关联
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
将有一个关联的 Planet
列表,由 Venus
、Earth
、Mars
等组成...
有时,关联可能会更复杂,并承载一些它所代表的 link 所独有的数据。例如,Earth
与 Sun
相关联,它在 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 语言来实现您的模型。保留一个天体容器。这个对象中的每一个都应该有一些坐标,一个旋转速度,以及一个根据它的旋转速度和经过的时间更新坐标的方法。然后,您的模拟将包含一个循环(代表经过的时间),并且在每次迭代中,您将遍历天体列表并为每个天体更新坐标,并显示结果。
在面向对象的编程中,我们有 uses、has-a、is-a 关系。请问地球和太阳是什么关系,地球绕着太阳转?
学习面向对象分析、设计和编程的最佳方法是什么?
对象,classes 和 is-a 关系
在您的面向对象领域模型中,有两个主要对象:
- 一个对象
Earth
of classPlanet
(实例化,is-a) - 一个对象
Sun
of classStar
(实例化,is-a) Planet
和Star
是特殊的CelestialObject
(特化,is-a)
class 对象与对象的关联
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
将有一个关联的 Planet
列表,由 Venus
、Earth
、Mars
等组成...
有时,关联可能会更复杂,并承载一些它所代表的 link 所独有的数据。例如,Earth
与 Sun
相关联,它在 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 语言来实现您的模型。保留一个天体容器。这个对象中的每一个都应该有一些坐标,一个旋转速度,以及一个根据它的旋转速度和经过的时间更新坐标的方法。然后,您的模拟将包含一个循环(代表经过的时间),并且在每次迭代中,您将遍历天体列表并为每个天体更新坐标,并显示结果。