- - PR -
あるクラスの paint メソッド内でサブクラスの paint メソッドを呼びたい
| 投稿者 | 投稿内容 | ||||||||
|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2003-09-05 16:42
こんな感じで親から子を呼ぶ例を作ってみたのですが
実行するとなぜか3行しかでません // A.java public class A { private static final String name = "A"; protected void print(int i) { if (i-- >= 0) System.out.println(name); if (i-- >= 0) print(i); } } // B.java public class B extends A { private static final String name = "B"; protected void print(int i) { if (i-- >= 0) System.out.println(name); if (i-- >= 0) print(i); } public void print(){super.print(5);} public static void main(String[] args){(new B()).print();} } これだと一応print(int)というメソッドは子クラスの同じシグネチャを持つメソッドを 呼び出していることになりませんか. | ||||||||
|
投稿日時: 2003-09-05 16:44
3行しかでないのは当たり前でした
if (i-- >= 0) print(i); は if (i >= 0) print(i); ですよね | ||||||||
|
投稿日時: 2003-09-05 18:07
さらにもっといえば整数値とブール値を組み合わせたものをつかって
継承階層にある任意の位置の同シグネチャメソッドを呼び出すような 機構はつくれますよね | ||||||||
|
投稿日時: 2003-09-06 14:21
このようなことをすると、継承階層が深くなり、スパゲッティコードの始まりとなってしまいます。任意の同名のメソッド呼ぶような仕組みを構築したければ、Chain-Of-Responsibilityのパターンを使用した方がいいように思われます。 このパターンを使用は、継承階層による静的な結びつきではなく、オブジェクトコンポジションによる動的な結びつきを実現することが出来るため、再利用性をより高くすることが出来ると思います。 | ||||||||
|
投稿日時: 2003-09-08 13:18
単に任意の同名メソッドを呼ぶのでなく
例えば SUPER(1)はsuperと同じ意味でSUPER(2)はsuperのそのまたsuper SUPER(-1)は派生クラスの同名メソッド というようなものが作れるというように思います. SUPER(n)はnが負のときはそのクラスが何であるか呼び出し側は 知らないわけです. そのクラスの決定は実行時にユニークに決定するということです. Chain-Of-Resposibilityがどういうものか知らないのであるいは 同じものをいっているのかも知れませんが こうしたものが継承階層を深くするという理由がわかりません | ||||||||
|
投稿日時: 2003-09-08 18:28
前々から思っていたのですが、こういう態度はどうかと思います。 GoFのデザインパターンぐらい有名なものなら、書籍を購入せずとも 概要ぐらいならすぐに知ることができます。 (少なくとも、この会議室に書き込めるのなら...) そういう努力を行わずに自分の主張だけを繰り返すのは、 ただの偏屈と思われかねないですよ。 | ||||||||
|
投稿日時: 2003-09-08 19:29
デザインパターンについては勉強しようとは思っています. ただ今すぐにというのは無理です このスレッドの内容には興味がありますが私自身はunibonさんの感じているようには 感じていないのです. このような場合私はメソッドの名前をむしろ積極的に変えるようにしています. ただこうしたことができれば面白いことができそうだということを 感じているので興味を持っているのです. 私の感覚では多態性を持った再帰メソッドというような感じでしょうか もちろんそれを実現するのにこのような仕組みが無くても実現はできるでしょう ただこのような仕組みがあればアルゴリズムが非常に簡単になる場合が あるように思います. そのことが私がこのスレッドの内容に興味を持った理由です. たとえば class A { public String name(){return "A";} public boolean print() { System.out.println(name()); return sub.isValid() && sub.print(); } } class B extends A{public String name(){return "B";}} class C extends B { public String name(){return "C";} public static void main() { C c = new C(); c.ancestor.print(); } } とやると A B C と出力するというようなことができるでは あまり役に立ちそうな例ではないかも知れませんが | ||||||||
|
投稿日時: 2003-09-08 22:26
Googleで調べれば、5分もかけずに調べられることですよ。 私は、その程度の労力はレスをつける上で最低限必要なものだといっているのです。 皆さんがあなたに対して新しい事柄を提示してあげているのに、 知らないの一言ではあんまりではないでしょうか? | ||||||||
