2009-11-05 5 views
7

Je suis la formation d'une classe pour un travail sur la dynamique moléculaire comme suit:Quand un initform est-il utilisé?

(defclass %atom (particle) 
    ((name :initarg :name :initform (error "Every atom in the system must have a name!")) 
    (mass :accessor mass :initarg :mass :initform (getmass name)) 
    (charge :accessor charge :initarg :charge :initform (getcharge name)))) 

Au début, je pensais que je pouvais faire référence à d'autres emplacements dans la définition de la classe avec un initForm ie (nom getmass) - mais se révèle être faux (ou le fait?!?). Au lieu de cela, on me dit que initialize-instance serait l'endroit pour mettre toutes ces choses d'initialisation ... assez juste.

La question que j'ai, alors, est quand est: initform utilisé? Quelle est la préférence idiomatique? Je l'ai vu utilisé comme ci-dessus pour générer du code (error "..."), et aussi pour initialiser les arguments par défaut quand un: initarg n'est pas fourni. Mais les deux peuvent facilement s'intégrer dans initialize-instance et peuvent avoir plus de sens là-bas. Existe-t-il un moyen particulier: initform est généralement utilisé?

Répondre

4

Habituellement, on utiliserait: initform pour donner à un slot une valeur par défaut. Avec defclass, on ne peut pas calculer des formulaires init simplement basés sur d'autres slots. Il y a aussi d'autres complications, donc: initform devrait être utilisé pour les formes simples.

Exemples

  • régler la fente de z d'un objet 3D-vecteur à 0,0

  • définir la liste de fenêtres dans un objet d'écran de NIL

  • définir la « fonction clé 'emplacement dans un objet à l'identité #'

  • définir l'emplacement 'chaîne de rapport' dans une erreur à "une erreur s'est produite"

Toute autre configuration plus compliquée de valeurs de tranche doit être effectuée dans une méthode. Si l'objet doit être configuré automatiquement après MAKE-INSTANCE, utilisez une méthode: AFTER pour INITIALISER-INSTANCE.

2

Pour compliquer les choses un peu plus loin, il y a aussi l'option de classe :default-initargs.

Personnellement, j'utiliser :default-initargs et :initform comme raccourcis lorsque la pleine puissance d'un après-méthode pour initialize-instance n'est pas nécessaire, et :initform lorsque la fente ne dispose pas d'un :initarg.

Questions connexes