封装:允许访问当前接收器对象以外的任何字段

时间:2013-03-23 11:36:42

标签: oop coding-style smalltalk

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

我不明白的是:为什么??

这种限制的理由是什么?

2 个答案:

答案 0 :(得分:6)

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

这提供了更好的隔离,因为如果你直接访问它,内部状态可以改变 - 你被搞砸了。此外,如果有人可以直接搞乱你的对象的状态,你就永远不知道在你不期望它的时候是否会在运行时发生变化。

一般来说,定义访问者并不困难,最后你得到的结果是:x like,{/ 1}}在smalltalk中,x like: falsex.like()在C-like中语言。 Ruby和Scala允许您使用空格定义方法并调用它们而不用括号,因此它们看起来就像字段访问:x.setLike(false)x.like。如果你被迫编写访问器,你没有很大的开销,但是如果你允许程序员用对象状态做他们想做的一切,那么你的代码就会出现混乱,这实际上是个大问题。

要了解如果不使用它可能会发生的所有不良事情需要一段时间。当你开始发展时,你不明白如果你把领域公之于众,会发生什么。这就是为什么C ++从一开始就是一种糟糕的语言,因为初学者更容易处理直接的现场访问。

此外,如果您考虑直接访问字段,那么OOP的整个概念就会被打破。因为您可以使用任何数据,如过程语言和类,然后只是扮演定义数据结构的函数的角色。

您可以在wikipedia上阅读有关封装的更多信息。 还有一篇关于What is Object Oriented Programming: A Critical Approach

的非常有趣的帖子

答案 1 :(得分:0)

阿黛尔·戈德伯格用格言“问,不要触摸”,用图形表达。