私はCLOSに関しては本当にノーブですので、私は昨年同じ実験を行いました。私の知見は、CLは実際にメソッドをエクスポートしたり、メソッドをマージしたりしないということです。バインディングを持つシンボルをエクスポートします。したがって、あなたは彼らが共有し、おそらくそこにドキュメントを置くべきシンボルとパッケージを作成する必要があります。
;; common symbols and documantation
(defpackage interface (:export _slot _reader _method))
(in-package interface)
(defgeneric _method (self)
(:documentation "This does this functionality"))
(defgeneric _reader (self)
(:documentation "This does that functionality"))
(defpackage pkg1 (:use :cl :interface) (:export _class1 _slot _reader _method))
(in-package pkg1)
(defclass _class1() ((_slot :initform "SLOT111" :initarg :slot :reader _reader)))
(defmethod _method ((self _class1)) (format t "SLOT-: ~a~%" (_reader self)))
(defpackage pkg2 (:use :cl :interface) (:export _class2 _slot _reader _method))
(in-package pkg2)
(defclass _class2() ((_slot :initform "SLOT222" :initarg :slot :reader _reader)))
(defmethod _method ((self _class2)) (format t "SLOT=: ~a~%" (_reader self)))
(defpackage test (:use :cl :pkg1 :pkg2))
(in-package test)
(defvar v1 (make-instance '_class1))
(defvar v2 (make-instance '_class2))
(_reader v1) ; ==> "SLOT111"
(_method v1) ; ==> nil (outputs "SLOT-: SLOT111")
(_reader v2) ; ==> "SLOT222"
(_method v2) ; ==> nil (outputs "SLOT-: SLOT222")
あなたはテストから何が起こったかをチェックアウトすることができます
(describe '_method)
_METHOD is the symbol _METHOD, lies in #<PACKAGE INTERFACE>, is accessible in
4 packages INTERFACE, PKG1, PKG2, TEST, names a function.
Documentation as a FUNCTION:
This does this functionality
#<PACKAGE INTERFACE> is the package named INTERFACE.
It imports the external symbols of 1 package COMMON-LISP and
exports 3 symbols to 2 packages PKG2, PKG1.
#<STANDARD-GENERIC-FUNCTION _METHOD> is a generic function.
Argument list: (INTERFACE::SELF)
Methods:
(_CLASS2)
(_CLASS1)
(describe '_reader)
_READER is the symbol _READER, lies in #<PACKAGE INTERFACE>, is accessible in
4 packages INTERFACE, PKG1, PKG2, TEST, names a function.
Documentation as a FUNCTION:
This does that functionality
#<PACKAGE INTERFACE> is the package named INTERFACE.
It imports the external symbols of 1 package COMMON-LISP and
exports 3 symbols to 2 packages PKG2, PKG1.
#<STANDARD-GENERIC-FUNCTION _READER> is a generic function.
Argument list: (INTERFACE::SELF)
Methods:
(_CLASS2)
(_CLASS1)
これは副作用を持っていますそのpkg2
を使用するパッケージからそのようなインスタンスを取得する必要がある場合、pkg1
_methodをインポートするとpkg2
インスタンスで動作します。
今、この部屋には象がいます。基本クラスをinterface
に定義し、それを_class1
と_class2
の親クラスとして追加するのはなぜでしょうか。しかし、それはあなたが求めていたものではありませんでした。
プロトコル(/インタフェース)を定義する方法を概念的に異なるクラスで同じ操作であれば、これは理にかなっているように:Pythonで
from pkg import *
のように動作しますマクロを、 -そして、ちょうど誰かがそれを必要とする場合は
(経験則として、1つのドキュメントストリングが両方のメソッドを説明することが有益である場合)。メソッドが完全に異なる操作である場合は、パッケージ修飾名を使用するか、メソッド名に適切な(異なる)プロトコル名を接頭する方が良いでしょう。 – jkiiskiありがとうございますが、このソリューションが機能しても、_design_の観点からは完全に間違っています。 ** _ pkg1 **と** _ pkg2 **の両方のパッケージが異なる開発者によって作成され管理されている場合はどうなりますか?だから両方を動作させるには、お互いを意識しているべきですか?どうして** _ class1 **と** _ class2 **が共通の祖先を共有しなければならないのはなぜですか? – AlexDarkVoid
@AlexDarkVoid私は同意します。lisp OOPシステムを設計する場合、インポートは、署名が互換性があり、結合がインポートされたライブラリに影響する場合、ディスパッチャを同じインポートされた名前でマージします。あなたがコンパイルされた言語を持っていなければ、それは面倒です。 – Sylwester