Почему Java требует интерфейсов, а Smalltalk - нет?

Я программировал в Smalltalk в течение некоторого времени, но мне никогда не нужны интерфейсы для реализации чего-либо. Тогда почему языки, такие как Java, не могут избавиться от интерфейсов? Это только Smalltalk или есть другой язык, который не нуждается в интерфейсах?

Ответы

Ответ 1

Поскольку Java статически типизируется, а Smalltalk - нет. Интерфейсы не предназначены для каких-либо целей, если вы не объявляете типы, а ваши переменные не подлежат проверке типов. Но на статически типизированном языке, таком как Java, они чрезвычайно удобны, потому что они позволяют вам иметь переменную, тип которой определяется методами, которые реализует объект вместо своего класса. Это значительно приближает вас к динамической типизации. Smalltalk изначально не отказывается от преимуществ проверки типов.

Ответ 2

Это проблема полиморфизма: в Java у вас есть статические типы, и поэтому вам нужно знать, какие сообщения могут отвечать вашему объекту... в Smalltalk (и других нестатических языках) вам просто нужно реализовать правильные методы, чтобы иметь полиморфизм,

Например:

  • В Java вам нужно реализовать Cloneable, который определяет метод Cloneable.clone для клонирования объектов. Затем компилятор знает ваш объект поймет этот метод (в противном случае он ошибка)
  • В smalltalk вам просто нужно реализовать метод #clone. Компилятор никогда не знает/не заботится о том, какие сообщения понимают ваши объектов, пока он не будет вызван.

Это также означает, что вы можете иметь полиморфные объекты, не являясь частью одной и той же иерархии... множественное наследование, микшины и другие подходы (черты присутствуют на Pharo) - это просто техника повторного использования, а не конструктивное ограничение.

Этот способ делать вещи часто называют "утиная печать"... см.: http://en.wikipedia.org/wiki/Duck_typing

Ответ 4

не уверен, что именно вы спрашиваете (точнее, на какой вопрос вы больше всего хотите ответить), но посмотрите на Ruby. По моему мнению, это намного ближе к smalltalk, чем Java.

Если бы я должен был ответить на вопрос о том, почему Java нуждается в интерфейсах, я бы сказал, что я говорю о том, что java является статически типизированным языком и принимает эту философию в той мере, в которой это делает Java, что и требует интерфейсов. Эффективно интерфейсы пытаются дать вам нечто вроде множественного наследования в java без множественных проблем наследования, с которыми сталкиваются другие языки (С++, я считаю).