如何在面向对象编程范式中建模“in-a”关系?

问题描述 投票:0回答:1

我是面向对象编程的新手(一直在以命令式/面向数据的方式编程),所以请耐心等待。据我了解,继承模拟了 IS-A 关系,成员变量模拟了 HAS-A 关系。但我遇到了类似“IN-A”关系的情况,并且我不知道如何以 OOP 风格完成此操作。请用这个例子来解释一下。

我有一个名为

World
的类,其中包含各种东西,可以是汽车、树木、桌子等。我也有课
Camera
。我可以将其建模为
World
HAS-A
Camera
。但是当我调用
Camera().render()
函数来渲染世界时,它不会工作,因为相机无法访问
World
的成员。现在我可以建模
Camera
HAS-A
World
。但是
World
将无法在
World
中放置/移动/旋转相机,因为它无法访问
Camera
的变换矩阵。

而且

World
IS-A
Camera
Camera
IS-A
World
都不是。这两个类都互相引用,我不知道如何使用 OOP 来建模这种循环引用和不明确的所有权。请帮忙。谢谢你。

oop theory paradigms
1个回答
0
投票

坦率地说,我发现总体的is-ahas-a等措辞没有什么帮助,除非你发现自己处于一个(学术?)环境中,你需要让事情变得更多比他们必须的复杂。在大多数实用的编程语言中,这些关系是相当明显的。如果你有一个类字段,当然该类“有”该成员,等等。

并非所有关系都必须是

has-ais-a。对于给出的示例,将交互建模为方法调用不是最自然的方法吗?类似的东西

camera.Render(world);

world.RenderUsing(camera);
有些人还将此类方法调用称为对象向其他对象“传递消息”。

然而,重点是

world

 不包含 
camera
camera
 也不包含 
world

© www.soinside.com 2019 - 2024. All rights reserved.