- PR -

あるクラスの paint メソッド内でサブクラスの paint メソッドを呼びたい

投稿者投稿内容
Jun
大ベテラン
会議室デビュー日: 2003/08/25
投稿数: 141
投稿日時: 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)というメソッドは子クラスの同じシグネチャを持つメソッドを
呼び出していることになりませんか.
Jun
大ベテラン
会議室デビュー日: 2003/08/25
投稿数: 141
投稿日時: 2003-09-05 16:44
3行しかでないのは当たり前でした
if (i-- >= 0) print(i);

if (i >= 0) print(i);
ですよね
Jun
大ベテラン
会議室デビュー日: 2003/08/25
投稿数: 141
投稿日時: 2003-09-05 18:07
さらにもっといえば整数値とブール値を組み合わせたものをつかって
継承階層にある任意の位置の同シグネチャメソッドを呼び出すような
機構はつくれますよね
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2003-09-06 14:21
引用:

さらにもっといえば整数値とブール値を組み合わせたものをつかって
継承階層にある任意の位置の同シグネチャメソッドを呼び出すような
機構はつくれますよね



このようなことをすると、継承階層が深くなり、スパゲッティコードの始まりとなってしまいます。任意の同名のメソッド呼ぶような仕組みを構築したければ、Chain-Of-Responsibilityのパターンを使用した方がいいように思われます。

このパターンを使用は、継承階層による静的な結びつきではなく、オブジェクトコンポジションによる動的な結びつきを実現することが出来るため、再利用性をより高くすることが出来ると思います。
Jun
大ベテラン
会議室デビュー日: 2003/08/25
投稿数: 141
投稿日時: 2003-09-08 13:18
単に任意の同名メソッドを呼ぶのでなく
例えば
SUPER(1)はsuperと同じ意味でSUPER(2)はsuperのそのまたsuper
SUPER(-1)は派生クラスの同名メソッド
というようなものが作れるというように思います.
SUPER(n)はnが負のときはそのクラスが何であるか呼び出し側は
知らないわけです.
そのクラスの決定は実行時にユニークに決定するということです.
Chain-Of-Resposibilityがどういうものか知らないのであるいは
同じものをいっているのかも知れませんが

こうしたものが継承階層を深くするという理由がわかりません
Wata
ぬし
会議室デビュー日: 2003/05/17
投稿数: 279
投稿日時: 2003-09-08 18:28
引用:

Junさんの書き込み (2003-09-08 13:18) より:
Chain-Of-Resposibilityがどういうものか知らないので


前々から思っていたのですが、こういう態度はどうかと思います。
GoFのデザインパターンぐらい有名なものなら、書籍を購入せずとも
概要ぐらいならすぐに知ることができます。
(少なくとも、この会議室に書き込めるのなら...)

そういう努力を行わずに自分の主張だけを繰り返すのは、
ただの偏屈と思われかねないですよ。
Jun
大ベテラン
会議室デビュー日: 2003/08/25
投稿数: 141
投稿日時: 2003-09-08 19:29
引用:

Wataさんの書き込み (2003-09-08 18:28) より:
引用:

Junさんの書き込み (2003-09-08 13:18) より:
Chain-Of-Resposibilityがどういうものか知らないので


前々から思っていたのですが、こういう態度はどうかと思います。
GoFのデザインパターンぐらい有名なものなら、書籍を購入せずとも
概要ぐらいならすぐに知ることができます。
(少なくとも、この会議室に書き込めるのなら...)

そういう努力を行わずに自分の主張だけを繰り返すのは、
ただの偏屈と思われかねないですよ。


デザインパターンについては勉強しようとは思っています.
ただ今すぐにというのは無理です
このスレッドの内容には興味がありますが私自身は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
と出力するというようなことができるでは
あまり役に立ちそうな例ではないかも知れませんが

Wata
ぬし
会議室デビュー日: 2003/05/17
投稿数: 279
投稿日時: 2003-09-08 22:26
引用:

Junさんの書き込み (2003-09-08 19:29) より:
デザインパターンについては勉強しようとは思っています.
ただ今すぐにというのは無理です


Googleで調べれば、5分もかけずに調べられることですよ。
私は、その程度の労力はレスをつける上で最低限必要なものだといっているのです。
皆さんがあなたに対して新しい事柄を提示してあげているのに、
知らないの一言ではあんまりではないでしょうか?

スキルアップ/キャリアアップ(JOB@IT)