LISP: Как я могу завладеть созданным экземпляром внутри инициализации-инстанции: вокруг метода
-
26-10-2019 - |
Вопрос
Я хочу создать (:: вокруг квалифицированного) специалиста по инициализации-инстанции для класса X, который сначала вызовет мета-метод, а затем назовет макияж другого класса, предоставив его созданным экземпляром X. Как я могу Получите удержание созданного экземпляра внутри инициализации-инстанции: вокруг метода? (Предполагая, конечно, после того, как позвонил в Next-Method, поэтому мы находимся на стороне заполнения: вокруг)
РЕДАКТИРОВАТЬ: класс A имеет двунаправленную связь с классом B через слот в каждом, который сохраняет идентификатор другого, но класс A требует идентификатора класса B, в то время как обратное не требуется. Итак, поток, который я хочу:
- Make-Instance 'Classa
Внутри инициализации-инстанции: вокруг класса я бы имел:
я. Make-Instance Classb и Aquire Id-Of-B.
II CALL-NEXT-METHOD Добавление идентификатора B-B
III Установите соответствующий слот Classb Point в наш созданный экземпляр класса (это мой первоначальный вопрос).
Теперь я мог бы сделать [i] в: до и [iii] в: после, но я не могу: классы A и B являются постоянными классами через слона, и я хочу обернуть весь поток в транзакции, которую я не хотел бы охватывать много методов Анкет Для тех, кто знаком со слоном, я хочу использовать обертку обеспечения транзакции, и я не хочу использовать явные вызовы функций Begint и Comful в разных точках.
Решение
Экземпляр передается как первый аргумент initialize-instance
.
(defmethod initialize-instance :around ((created myclass) ...)
;; do something with created
created)
Другие советы
Вы обычно делаете это с :after
метод, а не :around
метод Если вы не будете глубоко возиться в кишечнике Clos, не имеет большого смысла делать что -либо с ненициализированным экземпляром. Экземпляр предоставлен как первый аргумент initialize-instance
.
Для более глубокого обращения, посмотрите на CLHS, раздел 7.1.