From: Masao M. <mu...@hi...> - 2003-09-23 12:29:36
|
むとうです。 On Tue, 23 Sep 2003 21:07:00 +0900 (JST) Masahiro Sakai (酒井政裕) <sa...@to...> wrote: > さかいです。 > > > うーむ、難しいですね。 > > signal_chain_from_overriddenを使うと、シグナルのEmit時に > > signal_overrideのハンドラが呼ばれて、その後(その中で?) > > スーパークラスのハンドラが呼ばれるというような感じでしょうか。 > > そうです。 > signal_chain_from_overriddenの中で直接スーパークラスのハンドラが呼ばれます。 > > ふと閃いて、 > signal_override("clicked"){|instance, *args| > instance.signal_chain_from_overridden(*args) > } > と書く代わりに > def do_clicked(*args) > super(*args) > end > と書けるようにしてみました。 > こっちの方が遥かに分かりやすいですね。 確かに。このような改善はとても良いと思います。 > > あと、サブクラスでスーパークラスのデフォルトハンドラと同じ > > 名前のシグナルをsignal_newしようとするとエラーになるのでしょうか。 > > なんか、その辺も微妙にしっくりこないような....。しょうがないのかな。 > > 例えば > (process:2676): GLib-GObject-WARNING **: gsignal.c:1392: signal "clicked" already exists in the `GtkButton' class ancestry > RuntimeError: g_signal_newv failed > from (irb):27:in `signal_new' > from (irb):27 > ってな感じになります。 なるほど。 まぁ、エラーが出ればそれはそれで良いのかな。 > しっくりこないのは、名前の問題もあるでしょうね。 do_clickedの方が直感的ですよね。 元々私がもともとしっくりこないという風に感じていたことを書きます。 参考までに。 例えば以下のようなコーディングになるとイメージしていました。 class Test < Gtk::Button signal_override(...){ ... } signal_new(...){ .... } def initialize super end end initializeや他のメソッドはオーバーライドは同じメソッド名 で書くのにsignalだけはoverrideという特別なメソッドがあります。 引数や役割などの違いがあるから難しいかもしれませんが、直感的には signal_new(にあたるメソッド)がオーバーライドも兼ねると良いような 気がしていました。 class Test < Gtk::Button signal_new(...){ ... ;super(...)} =>オーバーライド signal_new(...){ .... } def initialize super end end -- .:% Masao Mutoh<mu...@hi...> |