- PR -

superクラスのメソッドの呼び出し

1
投稿者投稿内容
84
ベテラン
会議室デビュー日: 2005/11/04
投稿数: 83
投稿日時: 2007-04-11 12:01
javaでsuperクラスのメソッドを外から呼び出すことはできるでしょうか。
具他的には以下のような感じです。

public class A{
public A(){
}

public void test(){
System.out.println("super");
}
}

public class B extends A{
public B(){
}

public void test(){
System.out.println("child");
}
}

public class Test{
public static void main(String[] args){
A a = new A();
a.test();

A b = new B();
b.test(); // *
}
}
このとき、Testクラスを実行すると、
super
child
と出力されます。

'*'の箇所を書き換えることによって、
'b'インスタンスを使って、"super"と出力させることは可能でしょうか。

どなたかご存知の方いらっしゃいましたらお教えください。
よろしくお願いします。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2007-04-11 13:21
引用:

84さんの書き込み (2007-04-11 12:01) より:
'*'の箇所を書き換えることによって、
'b'インスタンスを使って、"super"と出力させることは可能でしょうか。


可能です。
コード:
        A b = new B();
        try {
            Class c = b.getClass().getSuperclass();
            A d = (A) c.newInstance();
            d.test();
        } catch (InstantiationException ex) {
            throw new RuntimeException(ex);
        } catch (IllegalAccessException ex) {
            throw new RuntimeException(ex);
        }


一応、「'b'インスタンスを使って、"super"と出力させること」はできています。
(インスタンスを別に作っています。私の知識ではここまででした。)

しかし、テレビのクイズ番組ではありませんし、普通はこういうことができてもやりません。
「'b'インスタンスを使って、"super"と出力させること」をしたい理由を提示されたほうが、オブジェクト指向に沿った良いやりかたが見つかるでしょう。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2007-04-11 13:27
オーバーライドしてしまうと、外から親クラスのメソッドを呼び出せません。
ユースケースに親クラスのメソッドの呼び出しがある場合、
オーバーライドすること自体が間違いです。

どうしてもオーバーライドする必要があるなら、サブクラスに、
コード:
public void superTest(){
    super.test();
}


と、委譲メソッドを実装するのが筋でしょう。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-04-11 16:00
オーバーライドされた動きではなく、敢えて親の実装を呼びたいという時点で
クラスの設計が胡散臭いように感じますね。
手を入れられないなんらかの事情があるのでしょうが…。

もし、該当クラスの設計変更が可能なのであれば、
宣言型に対して実装が何であるかを気にしなくてよいように
修正されることをお勧めします。

差し支えなければ、なぜそのようなことが必要になるのかを
提示いただけると的確なアドバイスができるかもしれませんね。
84
ベテラン
会議室デビュー日: 2005/11/04
投稿数: 83
投稿日時: 2007-04-12 09:27
みなさんありがとうございます。

確かにみなさんのおっしゃるとおり、
javaの設計思想に反しているので、
実現できたとしてもやるべきでないですよね。

現在、外部のライブラリを使っていまして、
あるクラスのメソッドにバグが含まれているのです。
それで該当ライブラリに手を加えることはNGなんです。

ただ、そのメソッドを使いたいので、
その親クラスのメソッドだけでもうまく使えたら・・・
と思ったうえでの投稿でした。

いろいろ考えてたのですが、
getter使ってメンバを取り出して、
バグがおこる条件の場合のみそのメソッドを呼ばない、
という方法で回避することにしました。

みなさん、ありがとうございました。
1

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