Ответ 1
Классы и прототипы
Наиболее отчетливое различие между "Я" и "Smalltalk" заключается в том, что "Я" не имеет понятия "классы". Нет никакого отношения "является экземпляром" между объектом и классом. Я, скорее, был одним из первых прототипов объектно-ориентированного языка и в этом отношении предшественником JavaScript. Следовательно, типичным способом создания нового объекта в Smalltalk является экземпляр, тогда как в Self это клонирование.
Выполнение и сообщения
Как вы уже выяснили, второе принципиальное различие заключается в том, что в "Я" единственным понятием исполнения является отправка сообщения, тогда как в Smalltalk также доступны назначение и доступ к поля объекта. Кроме того, в "Я" нет такого понятия, как глобальное состояние. Вы можете получить доступ только к тому, что вы можете получить, отправив сообщения. Self, однако, отслеживает некоторые "хорошо известные объекты", которые может быть предоставлен вновь созданному объекту.
Состояние и слоты
Размышляя над двумя предыдущими пунктами, "Нет классов" и "только сообщения", дает понять, что различие Smalltalk между состоянием и объектами и его поведение не присутствуют непосредственно в "Я" . Где Smalltalk хранит состояние в объектах экземпляры переменных и поведение в словарях методов в своем классе, Self использует это понятие слотов, которые могут представлять как состояние, так и поведение.
Работа с общим доступом
Чтобы помочь организовать поведение, Self не только предоставляет прототипы, но и черты. Черта - это объект, который содержит только поведение и разделяет несколько объектов. (Кроме того, есть также миксины, небольшие порции поведения и состояния, которые могут быть скомпонованы в другие объекты).
Объекты в Self могут иметь родителей, к которым отправляются сообщения, которые сам объект не понимает (делегирование). Это создает иерархии, которые могут быть похожими на класс наследование в Smalltalk, но не нужны классы.
Несколько примеров
Создание нового объекта
БолтовняObject new
Самостоятельная:
- простой объект:
()
или(||)
(чтобы исключить отсутствие явных слотов) - скопированный объект:
someObject copy
Создание объекта с некоторыми полями
БолтовняObject subclass: #MyObjects instanceVariableNames: 'foo bar'. "…"
MyObject new.
само
( | foo. bar | )
Создание коллекции
БолтовняOrderedCollection new.
само
list copy.
"Inheritance"
БолтовняObject subclass: #MyObject. "…"
само
( | parent* <- list | )
Ресурсы
Я предлагаю прочитать раздел библиографии на веб-странице Self.