Smalltalk 和 Java 中的 OO 之间的主要区别是什么?
Smalltalk 和 Java 中的 OO 之间的主要区别是什么?
请注意,我是一名Java程序员,试图通过探索Smalltalk来扩展他的视野。目前,我对Smalltalk几乎一无所知,只知道它比Java更纯粹。因此,我更喜欢这个答案,即展示各种Java概念如何映射到相应的Smalltalk概念,然后介绍Java中根本不存在的Smalltalk概念。
Smalltalk 和 Java 中的 OO 之间的主要区别是什么?
请注意,我是一名Java程序员,试图通过探索Smalltalk来扩展他的视野。目前,我对Smalltalk几乎一无所知,只知道它比Java更纯粹。因此,我更喜欢这个答案,即展示各种Java概念如何映射到相应的Smalltalk概念,然后介绍Java中根本不存在的Smalltalk概念。
Smalltalk使用消息传递,而不是方法调用。这种区别是微妙的,但非常强大。
一些术语:给定 ,是一个选择器,foo 是一个名为的消息的接收者(# 表示一个符号,就像 Common Lisp 会说的(或者更恰当地说,)),并且是一个参数或参数。当行执行时,将发送带有参数的消息。到目前为止,这很正常。在Java中,它看起来像。foo bar: baz
#bar:
#bar:
'bar
:bar
baz
foo
#:bar:
baz
foo.bar(baz);
在Java中,运行时系统会找出实际类型,找到最合适的方法,然后运行它。foo
在Smalltalk中,事情看起来几乎一样。向对象发送消息时,它会在其方法字典中搜索其名称与消息选择器的名称匹配的方法。如果它找不到,它会在其超类的方法字典中搜索,依此类推。很正常的东西。
如果它找不到任何匹配的方法,它会向自己发送消息,并将原始消息作为参数。(是的,消息发送是一个对象。但也只是一种方法。您可以覆盖它。#doesNotUnderstand:
#doesNotUnderstand:
例如,您可以有一个对象,该对象响应某组消息,同时将它收到的任何其他消息转发到某个委托对象。覆盖和嘿,presto,您有一个代理,无需维护即可使其协议与委托保持同步。#doesNotUnderstand:
不,我不是在开玩笑。Smalltalk的整个语法可能有15行长。JLS是...为什么不呢。为什么要在乎呢?简单的语法使拆解一块代码变得简单。元编程!重构!
没有以下各项的语法:
(n < 3) ifTrue: ['yes'] ifFalse: ['no']
1 to: 10 do: [:i | Transcript show: i asString]
[i := i / 0] ifError: ['oops!']
[i := i / 0] ensure: [stream close]
请注意所有这些 s - 具有干净语法的一等闭包。[]
this