gpt4 book ai didi

java - Smalltalk 和 Java 中的 OO 之间的主要区别是什么?

转载 作者:IT老高 更新时间:2023-10-28 20:47:25 26 4
gpt4 key购买 nike

Smalltalk 和 Java 中的 OO 之间的主要区别是什么?

请注意,我是一名 Java 程序员,试图通过探索 Smalltalk 来扩展他的视野。目前我对 Smalltalk 几乎一无所知,除了它比 Java 更纯粹。因此,我更喜欢显示各种 Java 概念如何映射到相应的 Smalltalk 概念的答案,然后介绍 Java 中根本不存在的 Smalltalk 概念。

最佳答案

消息传递

Smalltalk 使用消息传递,而不是方法调用。区别很微妙,但非常强大。

一些术语:给定 foo bar: baz , #bar:是一个选择器,foo 是一个名为#bar: 的消息的接收者 (# 表示一个符号,很像 Common Lisp 所说的 'bar(或者更恰本地说,:bar ))和 baz是一个参数参数。当行执行时,foo已发送消息 #:bar:带参数 baz .到目前为止,这很正常。在 Java 中,它看起来像 foo.bar(baz); .

在 Java 中,运行时系统会计算出 foo的实际类型,找到最合适的方法,然后运行它。

Smalltalk 中的东西看起来几乎相同。当您向对象发送消息时,它会在其方法字典中搜索名称与消息选择器的名称匹配的方法。如果找不到,则在其父类(super class)的方法字典中搜索,依此类推。很正常的东西。

如果找不到任何匹配的方法,它会向自己发送 #doesNotUnderstand:消息,以原始消息作为参数。 (是的,消息发送是一个对象。)但是 #doesNotUnderstand:也只是一种方法。你可以覆盖它。

例如,您可以有一个对象来响应某些消息集,同时将它收到的任何其他消息转发给某个委托(delegate)对象。覆盖 #doesNotUnderstand:嘿,你有一个代理,无需维护即可使其协议(protocol)与委托(delegate)保持同步。

简单的语法

不,我不是在开玩笑。 Smalltalk 的整个语法大概有 15 行。 JLS 是……不是。为什么关心?一个简单的语法可以很容易地拆开一大块代码。元编程!重构!

没有语法:

  • 条件语句:(n < 3) ifTrue: ['yes'] ifFalse: ['no']
  • for 循环:1 to: 10 do: [:i | Transcript show: i asString]
  • try catch :[i := i / 0] ifError: ['oops!']
  • 最终尝试:[i := i / 0] ensure: [stream close]

并注意所有这些 [] s - 具有简洁语法的一流闭包。

关于java - Smalltalk 和 Java 中的 OO 之间的主要区别是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3102695/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com