18

我只是在寻找将 Self 与 Smalltalk 区分开来的原因。

这不应该是大猩猩与鲨鱼的问题。我不是在寻找一个更好的原因,我只是对将一个定义为与另一个不同的原因感到困惑。在阅读了大约 2 小时并写了一些代码之后,它们对我来说似乎是同一种语言(顺便说一句:我终于理解了 Smalltalk 版本的“一切都是对象”。我必须说,这真是太棒了。哈哈!我以为 C# 已经搞定了……但它甚至没有接近这个!XD)

在过去几年的某个时间里,我在某处读过的随机内容:

  • Smalltalk 分配和消息/消息传递是唯一不是对象的东西,但是在 Self 中,即使这些东西也在对象框架中占有一席之地
  • “Self 在 OO 方面比 Smalltalk 更纯粹”。我还没有找到更具体的阐述。
4

3 回答 3

29

类和原型

Self 和 Smalltalk 之间最明显的区别是 Self 没有Classes的概念。对象和类之间不存在“<em>is an instance of”关系。Self 是最早的原型面向对象语言之一,在这方面是 JavaScript 的先驱。因此,在 Smalltalk 中创建新对象的典型方法是实例化,而在 Self 中则是克隆

执行和消息

正如您已经发现的那样,第二个根本区别在于,在 Self 中,执行的唯一概念是消息发送,而在 Smalltalk 中,也存在赋值对象字段访问。此外, Self中没有全局状态之类的东西。您只能通过发送消息访问可以检索的内容。然而,Self 跟踪一些“众所周知的对象”,可以给出一个新创建的对象。

状态和插槽

对前面两点“没有类”和“只有消息”的思考清楚地表明,Smalltalk 和对象状态之间的区别及其行为 并不直接存在于 Self 中。Smalltalk 将状态存储在对象的实例变量中,并将行为存储在其类的方法字典中,Self 使用的概念,它可以表示状态和行为。

分享行为

为了帮助组织行为,Self 不仅提供原型,还提供特征。特征是仅包含行为的对象,并且多个对象共享。(此外,还有mixins ,行为状态的一小部分,可以组合成其他对象)。

Self 中的对象可以有对象,向其发送对象本身不理解的消息(委托)。这会创建类似于 Smalltalk 中的类继承的层次结构,但不需要类。

几个例子

创建一个新对象

短暂聊天
Object new
自己:
  • 一个普通的对象:()(||)(明确没有插槽)
  • 复制的对象:someObject copy

创建一个包含一些字段的对象

短暂聊天
Object subclass: #MyObjects instanceVariableNames: 'foo bar'. "…" 
MyObject new.
自己
( | foo. bar | )

制作收藏

短暂聊天
OrderedCollection new.
自己
list copy.

“继承”</h3> Smalltalk
Object subclass: #MyObject. "…"
自己
( | parent* <- list | )

资源

我建议阅读Self 网页上的参考书目部分

于 2013-06-06T13:11:23.430 回答
11

Tobias 已经列出了主要区别,因此请阅读他的答案。

从某种意义上说,Self 就是 Smalltalk。Self 和 Smalltalk-80(如 Squeak 或 VisualWorks)之间的差异小于 Smalltalk-80 和 Smalltalk-72 之间的差异。它们看起来非常相似,因为它们是相关的。

有一个自我短语 - “自我就像 Smalltalk,只是更是如此”。你喜欢消息吗?我们将它们用于一切。你喜欢物体吗?我们的对象是真正自包含的,而不仅仅是类的实例。你喜欢概念上很小的语言吗?好吧,我们刚刚得到了对象、槽和消息。等等。

于 2013-06-06T22:22:32.353 回答
3

了解 Smalltalk 一段时间并阅读 Wikipedia:

  1. 自己:

    基于原型

    短暂聊天:

    基于类

  2. 自己:

    由于没有指明“_AddSlots:”原语的接收者,它是“self”。

    短暂聊天:

    self明确地写。

  3. 自己:

    您将插槽添加到对象。

    短暂聊天:

    您将插槽添加到类中,或者像这样对对象执行此操作

  4. 发明和影响“语言”/“系统”的人是不同的。Self 和 Smalltalk 可以看作是一个“系统”(改变你的观点),这意味着你作为程序员与系统交谈并在运行时改变它。

于 2013-06-06T11:56:08.763 回答