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