Self和Smalltalk之间的差异

The*_*kle 17 oop paradigms smalltalk selflanguage

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

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

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

  • Smalltalk赋值和消息/消息传递是唯一不是对象的东西,但是在Self中,即使这些东西在对象框架中也占有一席之地
  • "自我甚至比Smalltalk更加纯粹的OO".我无法找到更具体的阐述.

Tob*_*ias 28

类和原型

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

执行和消息

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

州和老虎机

对前两点"无类"和"仅消息"的思考清楚地表明,Smalltalk与对象状态及其行为之间的区别 并不直接存在于Self中.在Smalltalk将对象的实例中的状态存储在其类中的方法字典中的变量行为中,Self使用了插槽的概念,它可以表示状态和行为.

分享行为

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

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

几个例子

创建一个新对象

短暂聊天
Object new
Run Code Online (Sandbox Code Playgroud) 自:
  • 普通对象:()(||)(使缺少槽显式)
  • 复制的对象: someObject copy

使用某些字段创建对象

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

制作一个集合

短暂聊天
OrderedCollection new.
Run Code Online (Sandbox Code Playgroud)
list copy.
Run Code Online (Sandbox Code Playgroud)

"遗产"

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

资源

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


小智 11

托比亚斯已经列出了关键的差异,所以请阅读他的答案.

从某种意义上说,Self是Smalltalk.自和Smalltalk的-80如佳乐或VisualWorks中之间的差是小于的Smalltalk-80和Smalltalk-72之间的差异.它们看起来很相似,因为它们是相关的.

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