Common Lisp множественные метаклассы - PullRequest
0 голосов
/ 09 декабря 2018

Недавно обнаружив активный форк из weblocks , я бы хотел объединить его с библиотекой ORM mito .

Weblocks определяет макрос defwidget, который на практике оборачивает defclass примерно так:

(defclass my-class ()
  ((slot))
  (:metaclass weblocks/widgets/mop:widgets-class))

Между тем Mito работает так:

(defclass my-class ()
  ((...))
  (:metaclass mito:dao-table-class))

Как можноЯ делаю так, чтобы следующие работали?

(defclass my-class ()
  (...))

(defvar *obj* (make-instance 'my-class))

(render *obj*) ;render from weblocks

(save-dao *obj*) ;save-dao from mito

(my-method *obj*)

Я пробовал наследование, но потерпел неудачу разными способами.Я только использовал CLOS короткое время.Таким образом, у меня возникают проблемы с определением, где в спектре

«Я тупой <=====> Это невозможно»

Я стою.Любая помощь будет оценена.

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Даже если можно решить, как подсказывает @coredump, я не рекомендую смешивать модель (хранилище и бизнес-логику) и виджет (представление этих объектов) в одном классе.

Обычно,Я определяю свой виджет со слотом, указывающим на объект.Таким образом, вы также можете определить виджеты, которые содержат списки объектов.Это полезно, когда создание виджета для каждого отдельного объекта не имеет смысла.

Вам нужно только сделать ссылку 1-1 между объектом и виджетом, когда вам нужно обновить представление объекта отдельно от других блоков, какответ на какое-либо действие, например, при пометке задачи как ВЫПОЛНЕНО.

0 голосов
/ 09 декабря 2018

Я пробовал наследование, но потерпел неудачу разными способами.Я только использовал CLOS короткое время.Таким образом, мне трудно определить, где находится спектр ...

Не волнуйтесь, прыгнуть прямо к метаобъектам с небольшим опытом работы с CLOS, безусловно, сложно, я рекомендую прочитать «Искусство протокола метаобъектов», (также известный как «AMOP» (Грегор Кичалес и Джим Де Ривьер).Существует HTML-версия глав 5 и 6 Роберта Странда (Robert Strandh) по адресу http://metamodular.com/CLOS-MOP.

. Вы хотите определить гибридный метакласс, который наследуется от обоих метаклассов.

(defclass hybrid-metaclass (mito:dao-table-class
                            weblocks:widget-class)
  ())

Если вы определитекласс с указанным выше метаклассом, у вас будет это предупреждение:

;; WARNING: #<HYBRID-METACLASS COMMON-LISP-USER::MY-WIDGET {100B8FE683}> is not
;; defined to be a subclass of WEBLOCKS:WIDGET; consider adding WEBLOCKS:WIDGET
;; or a subclass thereof to the superclass list

Метакласс widget-class ожидает, что все его классы наследуются от базового класса, weblocks:widget.

ДавайтеОпределите такой базовый объект для нашего гибридного метакласса:

(defclass hybrid-widget (weblocks:widget) ()
  (:metaclass hybrid-metaclass))

Здесь hybrid-widget наследуется от weblocks:widget и имеет для метакласса hybrid-metaclass.Все ваши виджеты должны наследоваться от этого класса и иметь метакласс hybrid-metaclass (не стесняйтесь, чтобы найти лучшее имя).

...