第2回 Kahuaセミナー資料 > Gauche入門(2) > オブジェクトシステム > メソッド定義 > メソッドと手続きの違い


[Prev] [Next] [Up] [Contents][フレーム表示] [フレーム解除

メソッドと手続きの違い 応援する 

メソッドの手続きとの違い

メソッドが手続きと異る点を説明するのに、 <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は引数のクラスに応じて、どう振舞うかを自分で知っている。


[Prev] [Next] [Up] [Contents][フレーム表示] [フレーム解除

このサイトについて|ヘルプ|Q&A|個人情報保護|プライバシーポリシー|利用規約|コメント・トラックバック規約|削除規程|広告掲載
Copyright (c) 2005-2007 Time Intermedia Corporation