我只是在寻找将Self与Smalltalk区分开来的原因。
这不应该是大猩猩与鲨鱼的问题。我没有找到一个更好的理由,我只是把一个定义为与另一个不同的东西感到困惑。在阅读了大约2个小时后,它们对我来说似乎都是同一种语言,并且用一些代码捣乱(旁白:我终于明白了Smalltalk版本的"一切都是对象"。我必须说,它真是太棒了。哈哈!我认为C#钉了它......但它甚至没有接近它!XD)
我在过去几年的某个时间读过的随机内容:
答案 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 | )
答案 1 :(得分:11)
Tobias已经列出了主要的不同之处,请阅读他的答案。
从某种意义上说,Self就是Smalltalk。 Self和Smalltalk-80(如Squeak或VisualWorks)之间的差异小于Smalltalk-80和Smalltalk-72之间的差异。它们看起来非常相似,因为它们是相关的。
有一个自我短语 - “自我就像Smalltalk,只有更多”。你喜欢消息吗?我们将它们用于一切。你喜欢对象吗?我们的对象是真正自包含的,而不仅仅是类的实例。你喜欢概念上的小语言吗?好吧,我们刚刚得到了对象,插槽和消息。等
答案 2 :(得分:3)
了解Smalltalk一段时间并阅读维基百科:
自:
基于原型
Smalltalk中:
基于类
自:
由于未指示'_AddSlots:'原语的接收者,因此 是“自我”。
Smalltalk中:
你明确地写了self
。
自:
向对象添加插槽。
Smalltalk中:
您可以向类中添加插槽,也可以像this一样添加到对象
发明并影响“语言”/“系统”的人是不同的。 Self和Smalltalk可以看作是一个“系统”(改变你的观点),这意味着你作为程序员与系统交谈并在运行时进行更改。