Добро пожаловать в Smalltalk! Одной из замечательных особенностей Smalltalk является то, что он доверяет разработчикам, которые получают выгоду от силы, которая приходит с этим доверием. Поэтому такие слова, как «неспособность» и «незаконность», применяются редко.
Как и большинство других вещей, абстрактные классы в Smalltalk больше похожи на предложение / указатель, чем на жесткий закон. Два ключа, которые вы ищите - это #subclassResponsibility и #shouldNotImplement. Эти два метода являются подсказками для субклассеров, включать или не включать конкретный метод. Проверьте отправителей на наличие примеров на картинке (всегда отличная отправная точка для вопросов).
Поскольку "abstract", как описано выше, действительно относится к отдельным методам, ваши примеры не будут выдавать ошибку (если только не вызывается #subclassResponsibility или #shouldNotImplement из initialize.
Две маленькие вещи:
- Имена классов пишутся с заглавной буквы
Smalltalk, поэтому Abst, не abst.
- Поиск в Google имеет большое значение. Три
из четырех главных ссылок для
"Smalltalk абстрактный класс" были все
вам нужно ( этот в частности выглядел отлично).
ОБНОВЛЕНИЕ: если вы хотите дать понять пользователям вашего класса, что они не должны создавать экземпляры (как в вашем комментарии ниже), вы можете написать:
Abstract>>new
^ self subclassResponsibility.
Тогда «Абстрактное новое» -> ошибка, но «Абстрактное Подкласс новое» нормально.
Хотя до сих пор нет гарантии, что AbstractSubclass переопределил абстрактный метод (не #new, а тот, который заставил вас в первую очередь предотвратить использование экземпляров), на практике это не будет проблемой. Если вы действительно хотели, вы могли бы поставить проверку, может быть, в #initialize, чтобы убедиться, что ни один из методов экземпляра не вызывает #subclassResponsibility, но не беспокойтесь, если у вас нет веских причин.
ОБНОВЛЕНИЕ 2: Ваш вспомогательный метод для создания абстрактного класса будет:
Class>>makeAbstract
self class compile: 'new
^ self subclassResponsibility'.