- ベストアンサー
戻り値の異なるメソッドの多重定義はできないのですか?
戻り値の異なるメソッドの多重定義はできないものでしょうか? 例えば、Integer型の戻り値を持つメソッドHogeを持つクラスClass1があるとします。 public Class1{ ・・・ public Integer Hoge(){ ・・・ } ・・・ } これを継承したクラスClass2を作ります。 public Class2 extend Class1{ ・・・ public int Hoge(){ Integer buf = this.Hoge(); int buf2 = buf.intvalue(); } ・・・ } 私の環境ではエラーとなって実行できませんでしたが、 こういったことはできないものなのでしょうか? やりたいことは、(Javaのライブラリに含まれている)Integer型を持つメソッドを他のクラスから使用できるようにするためにint型に変換することなんですが、他のクラスの変更は一切しないで、この部分を書き換える(アダプタパターンを使う)ことによって実現したいと考えています。 他に良い方法はあるでしょうか?宜しければ、アドバイスお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
class Adapter extends Stack { public void push(int a) { ・ ・ } public int pop() { ・ ・ } } ということはできない(※戻り値だけが異なるメソッドを多重定義できない) ので、別の方法を考えよう。 --- ところで、2つのメソッド名(名前) public void push(int) public int pop() を定義しているクラス(またはInterface)は、 何という名前のクラス(またはInterface)だろう? (言い換えると、電卓クラス側からは、 これらメソッドは何というクラス(またはInterface)に 属しているように見えるのか、ということ) adapterパターンを使うというならば、 この点は重要ではないかな? --- 仮に上記2つのメソッドが Name という名前のクラスで定義されていた場合、 目的のアダプタ(とでも呼ぶのかな?)は、 例えば次のように書ける。 class Adapter extends Name { Stack mStack = new Stack(); public void push(int a) { //たとえば… mStack.push(new Integer(a)); } public int pop() { //ここも、メンバ変数mStackを利用した処理を書く } } 質問者さんの質問内容からは話がそれるので 余り詳しく書かないけれど、 この辺の話は、adapterパターンの基本事項なので、 ぜひ押さえておこう!
その他の回答 (4)
- ratsbane
- ベストアンサー率40% (4/10)
例えば、 public TestSuper(){ public Integer Hoge(){ return new Integer(1); } } として、 public TestSub() extends TestSuper{ public int getHoge(){ return Hoge().intValue(); } } みたいなのではだめでしょうか? 継承を使って、サブクラスでスーパークラスと引数の数と型が同じメソッドを宣言すると、オーバーライドになるので、戻り値が異なると互換性がないことになります。 なので、 public TestSub() extends TestSuper{ public int Hoge(Integer obj){ return obj.intValue(); } } などとするかでしょうか?
お礼
お答えいただきありがとうございました。 どうやら、この方法では無理なようなので、違う方法を考えることにします。ありがとうございました。
補足
ありがとうございます。 >>継承を使って、サブクラスでスーパークラスと引数 >>と型が同じメソッドを宣言すると、オーバーライドに >>なるので、戻り値が異なると互換性がないことになり >>ます。 う~ん。そうですよね。 ご指摘いただいたように引数の型を変えるのも有効かと思うのですが,今回は他のクラスから同じメソッドを使う必要があるので、無理そうです・・・。 何か、他の手段を探して見ます。
- azicyan
- ベストアンサー率21% (368/1747)
互換性のない戻り値の型、のエラーですね。 もう少し詳しくやりたい事を教えてください。 キャストじゃダメなのかな?
お礼
お答えいただきありがとうございました。 どうやら、この方法では無理なようなので、違う方法を考えることにします。ありがとうございました。
補足
ありがとうございます。 >>互換性のない戻り値の型、のエラーですね。 そうです。そんな感じのエラーがでてました。 >>もう少し詳しくやりたい事を教えてください。 逆ポーランドの電卓を作りたいと考えています。 計算クラスがあり、そこには数字をプッシュ、ポップするといったメソッド public void push(int a) public int pop() があり、それをJava標準ライブラリのスタッククラスを利用して記述したいのですが、スタッククラスのデータ型はオブジェクト型であるので、そのまま利用することはできませんよね。また、計算クラスは一切変更してはいけないといった条件もありますので、スタッククラスを継承したスタック2クラスを作成し、そこにint型のデータも扱えるようなメソッドを追加したいと考えています。 >>キャストじゃダメなのかな? アダプタパターンを使うことが前提になっているので、 継承を必ずしなければならないようです。
- chi-kon
- ベストアンサー率43% (58/132)
できません。 できたらポリモーフィズムが壊れてしまいます。 継承をしなければいいのではないでしょうか?
お礼
お答えいただきありがとうございました。 どうやら、この方法では無理なようなので、違う方法を考えることにします。ありがとうございました。
補足
ありがとうございます。 >>継承をしなければいいのではないでしょうか? やっぱり、継承をしないほうがいいですよね。しかし、アダプタパターンを用いることが条件になっているので、継承を使う必要があるそうです。
- azicyan
- ベストアンサー率21% (368/1747)
class1とclass2の両方に publicがついているからだと思う。 publicクラスは1つだけです。
お礼
お答えいただきありがとうございました。 どうやら、この方法では無理なようなので、別の方法を考えたいと思います。ありがとうございました。
補足
ありがとうございます。 >>publicクラスは1つだけです。 publicクラスは複数あっても問題ないと思いますが・・ 駄目なのですか?
お礼
うーん。そうなんですね。何か他の方法を考えたいと思います。 Adapterパターンの詳しい説明もありがとうございます。 Adapterパターンは違いを吸収し、2つのクラスをつなぎ合わせるみたいなものですね。