luna について教えて下さい (OO & luna 初心者)

NAKAJIMA Mikio minakaji @ osaka.email.ne.jp
2002年 1月 15日 (火) 20:24:36 JST


  luna について教えて下さい。

  grandpa, dad, me の 3 つのクラスを作ります。年長者程、親クラスになる
ように継承して定義します。

(luna-define-class grandpa () ())
(luna-define-class dad (grandpa) ())
(luna-define-class me (dad) ())

luna-test method を定義します。grandpa と dad class についてだけ定義し、
me クラスの method は定義しません (me は dad と同じ動作で足りるため)。
dad クラスの method からは :around modifier を使い、granpda クラスの
method を呼びます。

(luna-define-generic luna-test (person))

(luna-define-method luna-test ((gp grandpa))
  (setq x (1+ x)))

(luna-define-method luna-test :around ((dd dad))
  (luna-call-next-method)
  (setq y (1+ y)))

テスト用の変数を設定。いずれも 0 で初期化。

(setq x 0 y 0)

クラスと同名の変数にそれぞれインスタンス化。

(setq grandpa (luna-make-entity 'grandpa))
(setq dad (luna-make-entity 'dad))
(setq me (luna-make-entity 'me)))

method を定義していない末裔の me クラスのインスタンスに対し、luna-test
をコールします。

(luna-test me)
-> 2
x
-> 1
y
-> 2

何故 y が 2 になるのかなと、色々調べていたのですが、どうも

(1)me インスタンスについて luna-method をコールしたときに、
   luna-call-next-method で dad クラスの luna-test 自身がコールされ、

(2)再帰的にコールされた dad クラスの luna-test の中の
   luna-call-next-method で初めて grandpa の luna-test method がコール
   される

ために y が 2 回加算されてしまうようです。

luna.el の中を色々見ていたのですが、どうも
luna-class-find-parents-functions で method が見つかるまで、親クラスに
遡って method の探索をするためにこのような動作になるようです。

[質問]

(ア)あるクラスの親 class の method はあるが、(親クラスと同じ動作で良い
    から) そのクラス自身の method を定義しないことは OO 的に誤りなので
    しょうか?

(イ)(ア)がもし誤りの場合で、親クラスと全く同じ動作で足りる下位のクラス
    の method は一々親クラスと同じ関数定義をして、そのクラスに特化した
    method を設けるのが良いのでしょうか?  それとも
    luna-call-next-method を用いて親クラスの method をコールするだけの
    method を設けるのが良いのでしょうか?  それとももっと他に良い方法が
    あるのでしょうか?

(ウ)(ア)がもし誤りの場合で、下位クラスに明示的な method が定義されてい
    ない場合、una 的に下位のクラスから親クラスの method をコールするの
    を禁止する必要はないでしょうか?
-- 
中島幹夫 <minakaji @ osaka.email.ne.jp>
         <m-nakajima @ descente.co.jp>
http://www.asahi-net.or.jp/~gy2m-nkjm/




More information about the Emacs-mime-ja mailing list