2009-11-05 11 views
7

Estoy formando una clase para un cierto trabajo sobre la dinámica molecular como sigue:¿Cuándo se usa una forma de inicio?

(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)))) 

principio pensé que de alguna manera que podría referirse a otras ranuras dentro de la definición de clase con un initForm es decir (nombre getmass) - pero que resulta ser falso (¿o no?). En cambio, me dijeron que inicializar-instancia sería el lugar para poner todo ese material de inicialización ... bastante justo.

La pregunta que tengo, entonces, es ¿cuándo se usa initform? ¿Cuál es la preferencia idiomática? Lo he visto usado como arriba para generar código (error "...") y también para inicializar argumentos predeterminados cuando no se proporciona un: initarg. Pero ambos podrían encajar fácilmente en la instancia inicial y pueden tener más sentido allí. ¿Hay alguna manera en particular: generalmente se usa initform?

Respuesta

4

Por lo general, se usaría: initform para dar un valor predeterminado a la ranura. Con defclass uno no puede calcular las formas de inicio simplemente en función de otras ranuras. También hay otras complicaciones, entonces: initform debe usarse para formas simples.

Ejemplos

  • establecen la ranura z de un objeto 3D-vector a 0,0

  • establecer la lista de ventanas en un objeto de pantalla para NIL

  • establecer la 'función clave 'ranura en un objeto a' 'identidad

  • configure la ranura' cadena de informe 'en un error a "se produjo un error"

Cualquier otra configuración más complicada de los valores de las ranuras se debe hacer en un método. Si el objeto necesita configurarse automáticamente después de MAKE-INSTANCE, utilice un método: AFTER para INICIALIZAR-INSTANCIA.

2

Para complicar las cosas un poco más, también está la opción de clase :default-initargs.

Personalmente utilizar :default-initargs y :initform como accesos directos cuando no se necesita toda la potencia de un método después de initialize-instance y :initform cuando la ranura no tiene un :initarg.

Cuestiones relacionadas