我是面向对象编程的新手(一直在以命令式/面向数据的方式编程),所以请耐心等待。据我了解,继承模拟了 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 来建模这种循环引用和不明确的所有权。请帮忙。谢谢你。
坦率地说,我发现总体的is-a,has-a等措辞没有什么帮助,除非你发现自己处于一个(学术?)环境中,你需要让事情变得更多比他们必须的复杂。在大多数实用的编程语言中,这些关系是相当明显的。如果你有一个类字段,当然该类“有”该成员,等等。
并非所有关系都必须是has-a 或 is-a。对于给出的示例,将交互建模为方法调用不是最自然的方法吗?类似的东西
camera.Render(world);
或
world.RenderUsing(camera);
有些人还将此类方法调用称为对象向其他对象“传递消息”。然而,重点是
world
不包含
camera
,
camera
也不包含
world
。