Есть ли реализация интерфейсов классов для Smalltalk? - PullRequest
4 голосов
/ 04 марта 2011

В C # классы могут иметь интерфейсы, которые могут иметь несколько реализаций.Как ты это делаешь в smalltalk?

Ответы [ 4 ]

12 голосов
/ 04 марта 2011

Прежде всего вам обычно не нужны интерфейсы, потому что, если объект реализует те же сообщения, что и другой, он может заменить его.В Java и C # вы не можете сделать это, если они не находятся в одной иерархии, поэтому вам нужны интерфейсы.

  • В (всех) Smalltalk есть протоколы (категории методов), которые служат для неформальной группировки методоввсе вместе.
  • В Pharo Smalltalk есть черты.Сначала они выглядят как интерфейсы, но они также могут обеспечить реализацию.
5 голосов
/ 04 марта 2011

Как сказал Лукас, в большинстве случаев они вам не нужны. Главным образом потому, что для достижения полиморфизма единственное, что вам нужно, это реализовать одно и то же сообщение. Для них нет необходимости определять общий тип.

С другой стороны, иногда, с МОЕЙ точки зрения, вам нужны интерфейсы. В основном, когда у вас есть контракт, который нужно показать, или когда у вас есть своего рода абстрактный суперкласс. Это очень распространено при разработке фреймворков. Возьмите в качестве примера логгер или сериализатор. В этом случае вы можете определить обязательные методы, которые должен реализовать сериализатор. Затем вы можете создать абстрактный суперкласс со всеми методами, реализованными следующим образом:

LoggerIterface >> log: anObject
    self shouldBeImplemented


LoggerIterface >> reset
    self shouldBeImplemented

И т. Д. Итак, проверяя этот класс, вы теперь выясните, какие методы вы должны реализовать, чтобы пользователь этого объекта работал хорошо. Обратите внимание, что #shouldBeImplemented реализован в Object с чем-то вроде этого (в Pharo Smalltalk):

Object >> shouldBeImplemented
    "Announce that this message should be implemented"

    self error: 'This message should be implemented'

Но, как вы видите, это просто соглашение, оно не навязывается самим языком.

Приветствия

Мариано

5 голосов
/ 04 марта 2011

После сегодняшнего обсуждения с моим коллегой мне кажется, что ответом может быть любой класс, который можно считать интерфейсом, поскольку любой класс может быть передан в сообщении любому другому классу.

Любое количество классов в smalltalk может отвечать на одно и то же сообщение, поэтому вам не нужны интерфейсы, как в C # и java.

4 голосов
/ 12 октября 2011

Даже когда Dolphin Smalltalk (http://www.object -arts.com /) не называется «Интерфейсы», он предоставляет функцию «Протоколы», которые являются объектами первого класса.

Каждый протокол определяет набор селекторов (имена методов), и вы можете проверить, соответствует ли класс определенному протоколу:

conformsToProtocol: protocol
    "Answer whether the receiver conforms to the named <MethodProtocol>."

В итоге у вас есть формальный / определенный набор имен методов, и вы можете проверить, может ли определенный объект бытьиспользуя в контексте протокола.Кроме того, браузер классов покажет вам список протоколов, которым соответствует выбранный класс.

И есть браузер протоколов, так что вы можете исследовать каждый протокол и просматривать в масштабе всей системы, какие классы им соответствуют.

Подводя итог: Интерфейсы не нужны в Smalltalk, по крайней мере, для реализации полиморфизма.Однако некоторые диалекты Smalltalk обеспечивают разную степень поддержки протоколов, которые являются аналогом интерфейсов, но для динамических языков.

...