- - PR -
再帰するインスタンスメソッドの自分の呼び出しについて
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2005-12-08 17:37
class Foo
{ public void method(){...} } class Bar extends Foo { public void method() { ... method(); // 1 ... } } というようなコードがあったとき,1の部分でのメソッド呼び出しには ポリモーフィズムが使われるのでしょうか? 自分で考えた可能性として 1.ポリモーフィズムを使わず直接methodが呼ばれる 2.呼ばれるのはスーパークラスのmethodであるがポリモーフィズムにより 実際にはBarのmethodが呼ばれる. 3.VMの実装依存 | ||||
|
投稿日時: 2005-12-08 18:17
method()にSystem.out.println()でも入れてみれば、すぐに分かる気がしますが…。
いつでも、省略できるオブジェクトはthisであってsuperではないです。 public class Foo { public void method(int n){ System.out.println("Foo"); } public class Bar extends Foo { public void method(int n) { System.out.println("Bar"); if (n != 0) method(n - 1); } 呼ばれるのは元々Barのmethod()でしょう。 まずBarのメンバテーブルを探して、そこになかった場合にスーパークラスのテーブルを探しに行くはずなので。 スーパークラスのメソッドを呼ぶのなら、 super.method(n - 1); とか。 | ||||
|
投稿日時: 2005-12-09 03:08
ポリモーフィズムが問題になるのは、
のような場合の、1から呼び出された2の挙動では? | ||||
|
投稿日時: 2005-12-09 08:46
mioさん,coasmさん,どうもありがとうございます.
つまり自分の呼び出しの場合thisが省略されているのでsuperなどと同じように テーブルによらず静的に解決されて呼び出されるということでしょうか 静的に解決されているとするとつぎのようなソースで interface Foo { public void method(); } class Bar implements Foo { public void method() { ... method(); ... } } class Bar implements Foo { private void $method() // 元のmethod() { ... $method(); ... } public void method() // 新たに追加したメソッド { ... $method(); ... } } をバイトコードレベルで以下のように変換したとします.(実際できるかどうか わからんのですが) ここでメソッド$methodは元のメソッドmethodの名前を変えただけで 他の部分は変更せずあらたに元と同じ名前のmethodの中で$methodを 呼び出している. このとき元のメソッドの中の自分を呼び出す部分も変更する必要があるでしょうか また変更後のmethodのポリモーフィズムは正常に動作するでしょうか 心配なのは元のmethodの中で再帰する場合と基底クラスのメソッドを呼び出している場合 なのですが | ||||
|
投稿日時: 2005-12-09 08:49
よくみたらやりたいことと違うことを書いていました
class Bar implements Foo { private void $method() // 元のmethod() { ... method(); //ここでは自分自身でなく追加したメソッドを呼びたい ... } public void method() // 新たに追加したメソッド { ... $method(); ... } } | ||||
|
投稿日時: 2005-12-09 12:33
念のため聞きたいのですが、AOP関係のライブラリを作成されているのでしょうか。
またバイトコード操作のライブラリは何を使われているのでしょうか? | ||||
|
投稿日時: 2005-12-13 08:32
かつのりさん,申し訳ありません.他を見ていて返事が遅れましたことを
お詫びします. バイトコード変換にはobjectwebのASMというものをたまたま見つけたので 使っていますが,まだ使い始めたばかりでよくわかっていません. 何しろバイトコードに関する知識もないので,ニモニックダンプなど 見ながら試行錯誤してみたいと思っているのですが |
1