メソッドと手続きの違い 応援する  メソッドの手続きとの違い
メソッドが手続きと異る点を説明するのに、
<rectangle>という直行座標系での点クラスと、
<polar>という極座標系での点クラスを定義する。
(define-class <rectangle> ()
((x :init-keyword :x
:init-value 0)
(y :init-keyword :y
:init-value 0)))
(define-class <polar> ()
((r :init-keyword :r
:init-value 0)
(a :init-keyword :a
:init-value 0)))
続いて、x-of、y-of、r-of、a-ofというメソッドを定義する。
(define-method x-of ((pt <rectangle>))
(slot-ref pt 'x))
(define-method y-of ((pt <rectangle>))
(slot-ref pt 'y))
(define-method x-of ((pt <polar>))
(let ((r (r-of pt))
(a (a-of pt)))
(* r (cos a))))
(define-method y-of ((pt <polar>))
(let ((r (r-of pt))
(a (a-of pt)))
(* r (sin a))))
(define-method r-of ((pt <polar>))
(slot-ref pt 'r))
(define-method a-of ((pt <polar>))
(slot-ref pt 'a))
(define-method r-of ((pt <rectangle>))
(let ((x (x-of pt))
(y (y-of pt)))
(sqrt (+ (* x x) (* y y)))))
(define-method a-of ((pt <rectangle>))
(let ((x (x-of pt))
(y (y-of pt)))
(atan y x)))
この様に、各メソッドは同じ名前のものが複数定義されるが、
引数となるクラスが決まっている。
x-ofやy-ofは引数のクラスに応じて、どう振舞うかを自分で知っている。
| |
|