某些面向对象的语言(例如Smalltalk)不允许访问 除当前接收器对象之外的任何字段。例如: 像this.good或this.like:=false这样的表达式是合法的,但像x.like或this.like.good这样的表达式是非法的。
我不明白的是:为什么??
这种限制的理由是什么?
答案 0 :(得分:6)
这是OOP的核心思想之一,称为封装。除了物体本身之外,没有人知道它的内部状态。
这提供了更好的隔离,因为如果你直接访问它,内部状态可以改变 - 你被搞砸了。此外,如果有人可以直接搞乱你的对象的状态,你就永远不知道在你不期望它的时候是否会在运行时发生变化。
一般来说,定义访问者并不困难,最后你得到的结果是:x like
,{/ 1}}在smalltalk中,x like: false
,x.like()
在C-like中语言。 Ruby和Scala允许您使用空格定义方法并调用它们而不用括号,因此它们看起来就像字段访问:x.setLike(false)
,x.like
。如果你被迫编写访问器,你没有很大的开销,但是如果你允许程序员用对象状态做他们想做的一切,那么你的代码就会出现混乱,这实际上是个大问题。
要了解如果不使用它可能会发生的所有不良事情需要一段时间。当你开始发展时,你不明白如果你把领域公之于众,会发生什么。这就是为什么C ++从一开始就是一种糟糕的语言,因为初学者更容易处理直接的现场访问。
此外,如果您考虑直接访问字段,那么OOP的整个概念就会被打破。因为您可以使用任何数据,如过程语言和类,然后只是扮演定义数据结构的函数的角色。
您可以在wikipedia上阅读有关封装的更多信息。 还有一篇关于What is Object Oriented Programming: A Critical Approach
的非常有趣的帖子答案 1 :(得分:0)
阿黛尔·戈德伯格用格言“问,不要触摸”,用图形表达。