Что не так с экземплярами класса? - PullRequest
0 голосов
/ 10 октября 2018

Было бы хорошо, если бы кто-то мог объяснить, почему в Smalltalk выражение

class := Class new
  name: 'OurClass';
  superclass: Object

не подходит для создания нового класса.Точнее, что не так и что правильно , когда объект типа class пытается действовать как нормальный класс?Может ли это создавать экземпляры?Можно ли компилировать методы?Что это не может сделать?

1 Ответ

0 голосов
/ 11 октября 2018

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

Предположим, для этого обсуждения, что ваш пример кода был поддержан на диалектах Smalltalk и сделал именно то, что вы хотели: создать новый классOurClass как подкласс объекта.Большая проблема в том, что то, что вы создали, - это, по сути, остров, который отключен от остальной среды Smalltalk, поскольку вы обошли все метаданные / метаструктуру Smalltalk.Таким образом, вы не можете сделать что-то столь же простое, как открыть окно браузера и найти «OurClass» ... остальная часть Smalltalk не знает об этом.Такие вещи, как OurClass new не будут работать.Ваш новый класс также не имеет root-прав, поэтому, если вы отбросите переменную class из вашего примера, класс исчезнет.Это также означает, что он не будет частью какого-либо пакета, и определение вашего класса не будет сохранено с остальной частью вашего исходного кода.Вероятно, есть и другие сюрпризы, с которыми вы можете столкнуться в результате таких действий (например, отладчик может задохнуться и т. Д.). Так что для нужд создания классов общего назначения, что с ним не так?Почти все.

Тем не менее, есть один случай использования, когда вы могли бы законно захотеть создавать классы таким образом: метапрограммирование .Допустимым вариантом использования метапрограммирования будет создание анонимного класса, в котором вам нужен именно этот «отключенный» тип поведения и вам нужен класс временно / внутренне, но вы не хотите, чтобы его когда-либо видели / использовали остальные членыSmalltalk среда.Пока вы действительно хотите и должны делать что-то таким образом, я не вижу в этом никаких проблем.Несколько раз мне нужно было что-то подобное (никогда не делал это именно так, но близко), я был уверен, что задокументировал это очень хорошо, потому что это не та вещь, которую вы, вероятно, вспомните через 6 месяцев, кем вы былиделать или почему ... не говоря уже о другом программисте.Для метапрограммирования, где у вас есть особые потребности, и это правильный инструмент для работы, что с этим делать?Почти все.

...