一些面向对象的语言(例如 Smalltalk)不允许访问 当前接收者对象以外的任何字段。例如: 像 this.good 或 this.like:=false 这样的表达式是合法的,但是像 x.like 或 this.like.good 这样的表达式是非法的。
我不明白的是:为什么??
这种限制的理由是什么?
最佳答案
这就是OOP的核心思想之一,叫做封装。除了对象本身,没有人知道它的内部状态。
这提供了更好的隔离,因为内部状态可以随着时间的推移而改变,如果你直接访问它——你就完蛋了。此外,如果有人可以直接扰乱您的对象的状态,您永远不知道在运行时是否会发生您不期望的变化。
一般来说,定义访问器并不难,最后你会得到:x like
,x like: false
in smalltalk 和 x。 like()
, x.setLike(false)
类 C 语言。 Ruby 和 Scala 允许您使用空格定义方法并在不使用括号的情况下调用它们,因此它们看起来就像字段访问:x.like
、x.like = false
。如果您被迫编写访问器,您不会有很大的开销,但如果您允许程序员对对象状态做他们想做的任何事情,那么您的代码就会变得困惑,这实际上是一个大问题。
要了解如果不使用它可能会发生的所有坏事需要一些时间。当您开始开发时,您不明白如果将字段公开会发生什么。这就是为什么 C++ 是一门糟糕的语言,因为对于初学者来说,处理直接字段访问更容易。
此外,如果您考虑直接访问字段,那么 OOP 的整个概念就被打破了。因为您可以像在过程语言中一样使用您拥有的任何数据,而类则只起到定义数据结构的分组功能的作用。
您可以在 wikipedia 上阅读有关封装的更多信息. 还有一篇关于 What is Object Oriented Programming: A Critical Approach 的非常有趣的帖子
关于oop - 封装: allow accessing of fields of any other than the current receiver object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15586303/