2009-11-05 14 views
7

mam tworząc klasę dla niektórych prac nad dynamiki molekularnej w następujący sposób:Kiedy używany jest initform?

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

Początkowo myślałem, że mogę w jakiś sposób odnoszą się do innych gniazd w definicji klasy ze związkiem initform czyli (getmass name) - ale że okazuje się nieprawdziwe (lub robi to?!?). Zamiast tego powiedziano mi, że initialize-instance będzie miejscem, w którym wszystkie te rzeczy inicjalizacyjne będą wystarczająco jasne.

Pytanie, które mam, to: kiedy użyto initform? Jakie są preferencje idiomatyczne? Widziałem, jak był używany do generowania kodu ("..."), a także do inicjowania domyślnych argumentów, gdy nie podano: initarg. Ale oba te mogą łatwo wpasować się w instancję inicjującą i mogą mieć większy sens. Czy jest jakiś szczególny sposób: generalnie stosuje się initform?

Odpowiedz

4

Zwykle należy użyć: initform, aby dać slotowi pewną wartość domyślną. Z defclass nie można obliczyć formuł inicjalizacyjnych po prostu opartych na innych slotach. Są też inne komplikacje, więc: w przypadku prostych formularzy należy użyć initform.

Przykłady

  • ustawić gniazdo z obiektu 3D wektora 0.0

  • ustawić listę okien w obiekcie ekranu do NIL

  • ustawić funkcję „klucz "szczeliny w obiekcie do #" tożsamości

  • ustaw "ciąg raportu" szczeliny w błąd "wystąpił błąd"

Wszelkie inne, bardziej skomplikowane ustawienia wartości slotów powinny być wykonane w metodzie. Jeśli obiekt musi zostać skonfigurowany automatycznie po wykonaniu MAKE-INSTANCE, użyj metody: AFTER do INITIALIZE-INSTANCE.

2

Aby nieco komplikować sprawy, dostępna jest również opcja klasy :default-initargs.

Osobiście używam :default-initargs i :initform jako skróty, gdy nie jest potrzebna pełna moc w po-metodzie initialize-instance i :initform gdy szczelina nie ma :initarg.

Powiązane problemy