为什么Java需要接口而Smalltalk不需要?

2022-09-03 17:38:19

我已经在Smalltalk中编程了一段时间,但我从来没有真正需要接口来实现任何东西。那么,为什么像Java这样的语言不能摆脱接口呢?是只有Smalltalk还是有另一种不需要接口的语言?


答案 1

因为Java是静态类型的,而Smalltalk不是。当您不声明类型并且变量不会进行类型检查时,接口没有任何作用。但是在像Java这样的静态类型语言中,它们非常方便,因为它们让你有一个变量,其类型由对象实现的方法而不是其类定义。它使您更接近Smalltalk本身的动态类型,而不会放弃类型检查的好处。


答案 2

这是一个多态性问题:在Java中,你有静态类型,因此你需要知道你的对象可以回答哪些消息......在Smalltalk(和其他非静态语言)中,你只需要实现正确的方法即可实现多态性。

例如:

  • 在Java中,您需要实现Cloneable,Cloneable定义了方法Cloneable.clone以拥有可克隆的对象。然后,编译器知道您的对象将理解该方法(否则它将引发错误)
  • 在 smalltalk 中,您只需要实现方法#clone。编译器永远不会知道/不关心哪些消息理解你的对象,直到它被调用。

这也意味着你可以拥有多态对象,而不必成为同一层次结构的一部分......多重遗传,mixins和其他方法(特征存在于Pharo上)只是重用技术,而不是设计约束。

这种做事方式通常被称为“鸭子打字”......请参见: http://en.wikipedia.org/wiki/Duck_typing