Добавление / переопределение / редактирование методов тела в класс (Smalltalk — Squeak)

#smalltalk #squeak

#smalltalk #squeak

Вопрос:

Как я могу добавить новые методы или удалить методы определенного класса? Или, если я попытаюсь добавить метод, который уже существует, чтобы он переопределил его (хотя в этом случае я могу просто удалить старый и добавить новый, который является тем же самым)?

Можно ли это сделать, когда сам метод представлен в виде строки? (Я имею в виду делать это без использования внешних файлов и тому подобного, а просто записать метод в виде строки).

Например, метод, который получает класс, символ и строку, являющиеся кодом метода, и добавляет этот метод в класс, и, если существует, переопределяет старый метод:

 in: aClass add: aSymbol sourceCode: aString
  

и пример использования:

 in: ClassA add: #something sourceCode: 'self subclassResponsibility'
  

Ответ №1:

Это довольно просто. Проверьте категорию «компиляция» в классе Behavior. Вы можете делать такие вещи, как:

  MyClass compile: 'something
   ^ self subclassResponsability'.
  

Проверьте остальные методы в категории «компиляция», где вы можете указать, в какую категорию поместить метод, кому уведомлять, блок ошибок и т.д. Если вы вызовете #compile: с помощью существующего метода, он просто перезапишет его.

Для удаления того же самого проверьте методы, такие как #removeSelector: реализовано в поведении или ClassDescription. Вы можете сделать:

  MyClass removeSelector: something.
  

Приветствия

Комментарии:

1. Спасибо, я прочитал описание #compile: но я не смог на самом деле понять, что это возвращает? В нем просто говорится, что «Скомпилируйте аргумент, код, как исходный код в контексте получателя». Если я предполагаю, что это создает код метода, как ожидалось, я все равно не смог найти никакого полезного метода, который мог бы помочь мне добавить этот метод в класс. Есть идеи? Может быть, #compile: возвращает скомпилированный метод? Это непонятно..

2. Это добавлено напрямую. Когда вы выполняете компиляцию класса: ‘что-то самоназванное. self doSomething’, он компилирует такой метод, генерирует CompiledMethod и помещает его в methodDict или AClass. Итак, вы можете выполнить: AClass methodDict в:#something, и вы получите метод,