Лисп: Как я могу получить созданный экземпляр внутри метода initialize-instance: around - PullRequest
2 голосов
/ 28 апреля 2011

Я хочу создать (: вокруг квалифицированного) специалиста initialize-instance для класса X, который сначала вызовет метод next-next, а затем вызовет make-instance другого класса, предоставив ему созданный экземпляр X. Как я могу получить созданный экземпляр внутри метода initialize-instance: around? (если конечно после вызова call-next-method мы находимся на завершающей стороне: около)

EDIT: Класс A имеет двунаправленную связь с классом B через слот в каждом, который содержит идентификатор другого, но класс A требует идентификатор класса B, в то время как обратное не требуется. Итак, поток, который я хочу, это:

  1. make-instance 'classA
  2. внутри инициализируемого экземпляра: вокруг класса A у меня будет:

    я. make-instance classB и aquire id-of-B.

    ii call-next-method добавление id-of-B

    iii установить соответствующий слот id-of-A точки classB для нашего созданного экземпляра classA (это моя первоначальная причина вопроса)

Теперь я могу сделать [i] in: before и [iii] in: after, но я не могу: Классы A и B являются постоянными классами в слоне, и я хочу обернуть весь поток в транзакцию, которую я не хотел бы охватывать многими методами. Для тех, кто знаком с elephant, я хочу использовать оболочку обеспечивает транзакции и не хочу использовать явные вызовы функций begin и commit в разных точках.

Ответы [ 2 ]

6 голосов
/ 28 апреля 2011

Экземпляр передается как первый аргумент initialize-instance.

(defmethod initialize-instance :around ((created myclass) ...)
  ;; do something with created
  created)
4 голосов
/ 28 апреля 2011

Обычно вы делаете это методом :after, а не методом :around.Если вы не возитесь глубоко в кишках CLOS, бессмысленно что-либо делать с неинициализированным экземпляром.Экземпляр предоставляется в качестве первого аргумента initialize-instance.

. Для более глубокой обработки посмотрите CLHS, раздел 7.1 .

...