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