- - PR -
superクラスのメソッドの呼び出し
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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"と出力させることは可能でしょうか。 どなたかご存知の方いらっしゃいましたらお教えください。 よろしくお願いします。 | ||||||||
|
投稿日時: 2007-04-11 13:21
可能です。
一応、「'b'インスタンスを使って、"super"と出力させること」はできています。 (インスタンスを別に作っています。私の知識ではここまででした。) しかし、テレビのクイズ番組ではありませんし、普通はこういうことができてもやりません。 「'b'インスタンスを使って、"super"と出力させること」をしたい理由を提示されたほうが、オブジェクト指向に沿った良いやりかたが見つかるでしょう。 | ||||||||
|
投稿日時: 2007-04-11 13:27
オーバーライドしてしまうと、外から親クラスのメソッドを呼び出せません。
ユースケースに親クラスのメソッドの呼び出しがある場合、 オーバーライドすること自体が間違いです。 どうしてもオーバーライドする必要があるなら、サブクラスに、
と、委譲メソッドを実装するのが筋でしょう。 | ||||||||
|
投稿日時: 2007-04-11 16:00
オーバーライドされた動きではなく、敢えて親の実装を呼びたいという時点で
クラスの設計が胡散臭いように感じますね。 手を入れられないなんらかの事情があるのでしょうが…。 もし、該当クラスの設計変更が可能なのであれば、 宣言型に対して実装が何であるかを気にしなくてよいように 修正されることをお勧めします。 差し支えなければ、なぜそのようなことが必要になるのかを 提示いただけると的確なアドバイスができるかもしれませんね。 | ||||||||
|
投稿日時: 2007-04-12 09:27
みなさんありがとうございます。
確かにみなさんのおっしゃるとおり、 javaの設計思想に反しているので、 実現できたとしてもやるべきでないですよね。 現在、外部のライブラリを使っていまして、 あるクラスのメソッドにバグが含まれているのです。 それで該当ライブラリに手を加えることはNGなんです。 ただ、そのメソッドを使いたいので、 その親クラスのメソッドだけでもうまく使えたら・・・ と思ったうえでの投稿でした。 いろいろ考えてたのですが、 getter使ってメンバを取り出して、 バグがおこる条件の場合のみそのメソッドを呼ばない、 という方法で回避することにしました。 みなさん、ありがとうございました。 |
1