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

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

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

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

in: aClass add: aSymbol sourceCode: aString

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

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

person user550413    schedule 01.05.2011    source источник


Ответы (1)


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

 MyClass compile: 'something
   ^ self subclassResponsability'.

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

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

 MyClass removeSelector: something.

Ваше здоровье

person Mariano Martinez Peck    schedule 01.05.2011
comment
Спасибо, я прочитал описание #compile:, но так и не понял, что он возвращает? Он просто говорит, что скомпилируйте аргумент, код, как исходный код в контексте получателя. Если я предполагаю, что он создает код метода, как и ожидалось, я все равно не смог найти какой-либо полезный метод, который мог бы помочь мне добавить этот метод в класс. Любые идеи? Может быть, #compile: возвращает CompiledMethod? Не ясно.. - person user550413; 01.05.2011
comment
Это прямо добавлено. Когда вы компилируете aClass: 'что-то самоназвание. self doSomething», он компилирует такой метод, генерирует CompiledMethod и помещает его в methodDict или aClass. Итак, вы можете сделать: aClass methodDict at:#something и вы получите метод, - person Mariano Martinez Peck; 01.05.2011