2

一些面向对象的语言(例如 Smalltalk)不允许访问除当前接收器对象之外的任何字段。例如:像 this.good 或 this.like:=false 这样的表达式是合法的,但像 x.like 或 this.like.good 这样的表达式是非法的。

我不明白的是:为什么?

这种限制的理由是什么?

4

2 回答 2

6

这是OOP的核心思想之一,称为封装。除了对象本身之外,没有人知道它的内部状态。

这提供了更好的隔离,因为内部状态可以随着时间的推移而改变,如果你直接访问它——你就完蛋了。此外,如果有人可以直接弄乱您的对象的状态,您永远不知道在运行时是否会发生某些您不期望的变化。

一般来说,定义访问器并不难,最终你会得到: x like, x like: falsesmalltalk 和x.like(),x.setLike(false)类 C 语言。Ruby 和 Scala 允许您使用空格定义方法并在不带括号的情况下调用它们,因此它们看起来就像字段访问:x.like, x.like = false。如果您被迫编写访问器,您不会有很大的开销,但是如果您允许程序员对对象状态做任何他们想做的事情,那么您的代码就会变得混乱,这实际上是一个大问题。

要了解如果您不使用它可能会发生的所有坏事需要一些时间。当您开始开发时,您不明白如果将字段公开会发生什么。这就是为什么 C++ 是一门糟糕的语言,因为对于初学者来说,处理直接字段访问更容易。

此外,如果您考虑直接访问字段,那么 OOP 的整个想法就会被打破。因为您可以像在过程语言中一样使用您拥有的任何数据,而类则只扮演定义数据结构的分组功能的角色。

您可以在wikipedia上阅读有关封装的更多信息。还有一篇关于什么是面向对象编程:一种关键方法的非常有趣的帖子

于 2013-03-23T12:12:09.713 回答
0

阿黛尔·戈德堡(Adele Goldberg)用“问,不要碰”的格言形象地表达了这一点。

于 2013-12-22T05:24:35.247 回答