一些面向对象的语言(例如 Smalltalk)不允许访问除当前接收器对象之外的任何字段。例如:像 this.good 或 this.like:=false 这样的表达式是合法的,但像 x.like 或 this.like.good 这样的表达式是非法的。
我不明白的是:为什么?
这种限制的理由是什么?
一些面向对象的语言(例如 Smalltalk)不允许访问除当前接收器对象之外的任何字段。例如:像 this.good 或 this.like:=false 这样的表达式是合法的,但像 x.like 或 this.like.good 这样的表达式是非法的。
我不明白的是:为什么?
这种限制的理由是什么?
这是OOP的核心思想之一,称为封装。除了对象本身之外,没有人知道它的内部状态。
这提供了更好的隔离,因为内部状态可以随着时间的推移而改变,如果你直接访问它——你就完蛋了。此外,如果有人可以直接弄乱您的对象的状态,您永远不知道在运行时是否会发生某些您不期望的变化。
一般来说,定义访问器并不难,最终你会得到: x like
, x like: false
smalltalk 和x.like()
,x.setLike(false)
类 C 语言。Ruby 和 Scala 允许您使用空格定义方法并在不带括号的情况下调用它们,因此它们看起来就像字段访问:x.like
, x.like = false
。如果您被迫编写访问器,您不会有很大的开销,但是如果您允许程序员对对象状态做任何他们想做的事情,那么您的代码就会变得混乱,这实际上是一个大问题。
要了解如果您不使用它可能会发生的所有坏事需要一些时间。当您开始开发时,您不明白如果将字段公开会发生什么。这就是为什么 C++ 是一门糟糕的语言,因为对于初学者来说,处理直接字段访问更容易。
此外,如果您考虑直接访问字段,那么 OOP 的整个想法就会被打破。因为您可以像在过程语言中一样使用您拥有的任何数据,而类则只扮演定义数据结构的分组功能的角色。
您可以在wikipedia上阅读有关封装的更多信息。还有一篇关于什么是面向对象编程:一种关键方法的非常有趣的帖子
阿黛尔·戈德堡(Adele Goldberg)用“问,不要碰”的格言形象地表达了这一点。