- PR -

再帰するインスタンスメソッドの自分の呼び出しについて

1
投稿者投稿内容
Jun
大ベテラン
会議室デビュー日: 2003/08/25
投稿数: 141
投稿日時: 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の実装依存
mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 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);

とか。
coasm
大ベテラン
会議室デビュー日: 2001/11/26
投稿数: 237
投稿日時: 2005-12-09 03:08
ポリモーフィズムが問題になるのは、

コード:
class Foo extends Bar 
{
  public void method()
  {
    ...
    super.method();   // 1
    ...
  } 
} 

class Bar 
{ 
  public void method() 
  { 
    ... 
    method(); // 2
    ... 
  } 
}



のような場合の、1から呼び出された2の挙動では?
Jun
大ベテラン
会議室デビュー日: 2003/08/25
投稿数: 141
投稿日時: 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の中で再帰する場合と基底クラスのメソッドを呼び出している場合
なのですが

Jun
大ベテラン
会議室デビュー日: 2003/08/25
投稿数: 141
投稿日時: 2005-12-09 08:49
よくみたらやりたいことと違うことを書いていました

class Bar implements Foo
{
private void $method() // 元のmethod()
{
...
method(); //ここでは自分自身でなく追加したメソッドを呼びたい
...
}

public void method() // 新たに追加したメソッド
{
...
$method();
...
}
}
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2005-12-09 12:33
念のため聞きたいのですが、AOP関係のライブラリを作成されているのでしょうか。
またバイトコード操作のライブラリは何を使われているのでしょうか?


Jun
大ベテラン
会議室デビュー日: 2003/08/25
投稿数: 141
投稿日時: 2005-12-13 08:32
かつのりさん,申し訳ありません.他を見ていて返事が遅れましたことを
お詫びします.

バイトコード変換にはobjectwebのASMというものをたまたま見つけたので
使っていますが,まだ使い始めたばかりでよくわかっていません.
何しろバイトコードに関する知識もないので,ニモニックダンプなど
見ながら試行錯誤してみたいと思っているのですが
1

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