2017-07-12 3 views
2

私はクラスメッセージのインスタンスを持っています。私は "msg"を呼び出します。私はクラス "my-message"を定義し、インスタンス "msg"をそのクラスにすることを望みます。インスタンスをサブクラスにキャストする方法は?

それは比較的簡単なはずですが、私はそれをどうやって行うのか分かりません。クラスを変更すると私には理解できないエラーが出る。

(defclass my-message (message) 
    ((account-name :accessor account-name :initform nil :initarg :account-name))) 

(change-class msg 'my-message :account-name account-name) 

ERROR : 
While computing the class precedence list of the class named MW::MY-MESSAGE. 
The class named MW::MESSAGE is a forward referenced class. 
The class named MW::MESSAGE is a direct superclass of the class named MW::MY-MESSAGE. 
+0

あなたはクラス 'msg'のインスタンスがあるとします。あなたのコードでは 'message'クラスを使います。このクラス 'message'はどこに定義されていますか? –

答えて

4
The class named MW::MESSAGE is a forward referenced class. 

前方参照されるクラスは、あなたが参照するクラスですが、まだ定義されていません。あなたがクラスの名前を見ると、それはMW::MESSAGEです。別のパッケージにMESSAGEという別のクラスをサブクラス化したいとします。インポートする記号に問題がある可能性があります。

The class named MW::MESSAGE is a direct superclass of the class named MW::MY-MESSAGE. 

MW::MESSAGEクラスがまだ定義されていないので、あなたはそれのインスタンスを作成することはできません。これはまた、サブクラスのいずれかのインスタンスを作ることができない理由です(MW::MY-MESSAGEなど)。

+1

それは本当にシンボルの問題でした。私は "前方参照されたクラス"が何か不足していた。どうもありがとう ! – Arnaud

4

これは私の作品:オブジェクト自体が変更されますので、

CL-USER> (defclass message()()) 
#<STANDARD-CLASS COMMON-LISP-USER::MESSAGE> 

CL-USER> (defparameter *msg* (make-instance 'message)) 
*MSG* 

CL-USER> (describe *msg*) 
#<MESSAGE {1002FE43F3}> 
    [standard-object] 
No slots. 


CL-USER> (defclass my-message (message) 
      ((account-name :accessor account-name 
          :initform nil 
          :initarg :account-name))) 
#<STANDARD-CLASS COMMON-LISP-USER::MY-MESSAGE> 

CL-USER> (change-class *msg* 'my-message :account-name "foo") 
#<MY-MESSAGE {1002FE43F3}> 

CL-USER> (describe *msg*) 
#<MY-MESSAGE {1002FE43F3}> 
    [standard-object] 

Slots with :INSTANCE allocation: 
    ACCOUNT-NAME = "foo" 

注これはではないことは、をキャスト。今は別のクラスのインスタンスです。 キャスティングは、通常、変更されていないものの解釈だけが状況によって変化することを意味します。しかしここでは、インスタンスは実際に変更され、古い解釈はもはや適用されません。

関連する問題