Self和Smalltalk之间的差异

时间:2013-06-06 10:18:27

标签: oop smalltalk paradigms selflanguage

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

这不应该是大猩猩与鲨鱼的问题。我没有找到一个更好的理由,我只是把一个定义为与另一个不同的东西感到困惑。在阅读了大约2个小时后,它们对我来说似乎都是同一种语言,并且用一些代码捣乱(旁白:我终于明白了Smalltalk版本的"一切都是对象"。我必须说,它真是太棒了。哈哈!我认为C#钉了它......但它甚至没有接近它!XD)

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

  • Smalltalk分配和消息/消息传递是唯一的事情 那些不是对象,但在自我中,甚至是这些 事物在对象框架中占有一席之地
  • "自我更加纯粹的OO智慧 比Smalltalk是"。我还没有找到更具体的阐述。

3 个答案:

答案 0 :(得分:26)

类和原型

Self和Smalltalk之间最明显的区别是Self没有 Classes 的概念。对象和类之间没有“的实例”关系。 Self而不是第一个原型面向对象语言之一,在这方面是JavaScript的前身。因此,在Smalltalk中创建新对象的典型方法是实例化,而在Self中,克隆

执行和消息

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

州和老虎机

对前两点“无类”和“仅消息”的思考清楚地表明,对象状态行为之间的Smalltalk区别是不直接存在于自我中。 Smalltalk将状态存储在其类中方法词典中的对象的实例变量行为中,Self使用了这一概念插槽,可以表示状态和行为。

分享行为

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

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

一些例子

创建新对象

短暂聊天
Object new
自:
  • 普通对象:()(||)(以明确缺少广告位)
  • 复制的对象:someObject copy

创建包含某些字段的对象

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

制作集合

短暂聊天
OrderedCollection new.
list copy.

“继承”

短暂聊天
Object subclass: #MyObject. "…"
( | parent* <- list | )

资源

我建议您阅读bibliography section on the Self webpage

答案 1 :(得分:11)

Tobias已经列出了主要的不同之处,请阅读他的答案。

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

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

答案 2 :(得分:3)

了解Smalltalk一段时间并阅读维基百科:

  1. 自:

      

    基于原型

    Smalltalk中:

      

    基于类

  2. 自:

      

    由于未指示'_AddSlots:'原语的接收者,因此   是“自我”。

    Smalltalk中:

    你明确地写了self

  3. 自:

      

    向对象添加插槽。

    Smalltalk中:

      

    您可以向类中添加插槽,也可以像this一样添加到对象

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