next up previous
Next: 13.3 インスタンスの生成 Up: 13 オブジェクト指向プログラミングの例 Previous: 13.1 クラスの定義

13.2 メソッドの定義

メソッド定義は以下のようにする. 浮遊物クラスの:initは関数instanceにより生成する際に 利用されるメソッドである.

(defmethod particle
  (:init ()
         (setq pname nil
               mass 1
               x-position 0
               y-position 0
               x-speed 0
               y-speed 0
               x-acceleration (car *gravity*)
               y-acceleration (cadr *gravity*))
         self)
  (pname () pname)
  (mass () mass)
  (x-position () x-position)
  (y-position () y-position)
  (x-speed () x-speed)
  (y-speed () y-speed)  
  (x-acceleration () x-acceleration)
  (y-acceleration () y-acceleration)  
  (set-pname (v) (setq pname v))
  (set-mass (v) (setq mass v))
  (set-x-position (v) (setq x-position v))
  (set-y-position (v) (setq y-position v))
  (set-x-speed (v) (setq x-speed v))
  (set-y-speed (v) (setq y-speed v))
  (set-x-acceleration (v) (setq x-acceleration v))
  (set-y-acceleration (v) (setq y-acceleration v))

  (position-of ()
               (list (send self 'x-position)
                     (send self 'y-position)))
  (velocity-of ()
               (list (send self 'x-speed)
                     (send self 'y-speed)))
  (acceleration-of ()
                   (list (send self 'x-acceleration)
                         (send self 'y-acceleration)))
  (set-position (x y)
                (send self 'set-x-position x)
                (send self 'set-y-position y))
  (set-velocity (x y)
                (send self 'set-x-speed x)
                (send self 'set-y-speed y))
  (new-position ()
                (send self 'set-x-position
                      (+ (send self 'x-position)
                         (send self 'x-speed)))
                (send self 'set-y-position
                      (+ (send self 'y-position)
                         (send self 'y-speed))))
  (new-velocity ()
                (send self 'set-x-speed
                      (+ (send self 'x-speed)
                         (send self 'x-acceleration)))
                (send self 'set-y-speed
                      (+ (send self 'y-speed)
                         (send self 'y-acceleration))))
  (status ()
          (format t
                  "~%~a's Pos:~a Vel:~a Acc:~a"
                  (send self 'pname)
                  (send self 'position-of)
                  (send self 'velocity-of)
                  (send self 'acceleration-of)))
  (crashed? ()
            (and (> (send self 'y-position)
                    *initial-height*)
                 (not (< (send self 'x-position) 0))
                 (< (send self 'x-position)
                    *asteroid-width*)))
  )
pname,x-position,set-pnameなどがメソッド名である. そのメソッド名の次にはそのメソッドへの引数がくるとする. ロケットはパーティクルクラスのサブクラスなので, パーティクルクラスのメソッドをすべて継承する. そのため,ロケットのメソッドは以下のように ロケットに特有のメソッドのみの定義となる.

(defmethod rocket
  (:init () (setq motor-force '(0 0)) self)
  (set-motor-force (v) (setq motor-force v))
  (motor-force () motor-force)
  (set-motor (force)
             (send self 'set-motor-force force)
             (send self 'set-x-acceleration
                   (+ (car *gravity*) (car force)))
             (send self 'set-y-acceleration
                   (+ (cadr *gravity*) (cadr force))))
  (status
   ()
   (format t "~%~a's Pos:~a Vel:~a Acc:~a"
           (send self 'pname)
           (send self 'position-of)
           (send self 'velocity-of)
           (send self 'acceleration-of))
   (format t " Motor:~a" (send self 'motor-force)))
  )


generated through LaTeX2HTML. M.Inaba 平成18年5月7日