2017-07-12 3 views
2

Ich habe eine Instanz der Klasse Nachricht ich werde "msg" aufrufen. Ich habe eine Klasse "my-message" definiert und möchte, dass "msg" nun zu dieser Klasse gehört.Wie "wirft" man eine Instanz in eine Unterklasse?

Es klingt für mich wie es sollte relativ einfach sein, aber ich weiß nicht, wie es geht. change-class gibt mir einen Fehler, den ich nicht verstehe.

(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

Sie sagen, Sie haben eine Instanz der Klasse 'msg'. In Ihrem Code verwenden Sie eine Klasse "Nachricht". Wo ist diese Klasse "Nachricht" definiert? –

Antwort

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

Eine Vorwärts referenzierten Klasse ist eine Klasse, auf die Sie verweisen, aber noch nicht festgelegt. Wenn Sie sich den Namen der Klasse ansehen, lautet sie MW::MESSAGE. Ich nehme an, dass Sie eine andere Klasse namens MESSAGE in einem anderen Paket ableiten möchten; Es könnte etwas mit den importierten Symbolen nicht stimmen.

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

Da die MW::MESSAGE Klasse noch nicht definiert ist, kann man nicht eine Instanz davon machen. Aus diesem Grund können Sie keine Instanz einer der Unterklassen wie MW::MY-MESSAGE erstellen.

+1

Es war in der Tat ein Symbolproblem. Mir gefehlt was eine "vorwärtsgerichtete Klasse" war. Danke vielmals ! – Arnaud

4

Dies funktioniert für mich:

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" 

Beachten Sie, dass dies kein gegossen ist, da das Objekt selbst geändert wird. Es ist jetzt eine Instanz einer anderen Klasse. casting würde normalerweise bedeuten, dass nur die Interpretation der unveränderten Sache in einem Kontext ändert. Aber hier ist die Instanz wirklich verändert und die alte Interpretation gilt nicht mehr.

Verwandte Themen