戻り値の異なるメソッドの多重定義はできないものでしょうか?
例えば、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型に変換することなんですが、他のクラスの変更は一切しないで、この部分を書き換える(アダプタパターンを使う)ことによって実現したいと考えています。
他に良い方法はあるでしょうか?宜しければ、アドバイスお願いします。
No.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パターンの基本事項なので、
ぜひ押さえておこう!
うーん。そうなんですね。何か他の方法を考えたいと思います。
Adapterパターンの詳しい説明もありがとうございます。
Adapterパターンは違いを吸収し、2つのクラスをつなぎ合わせるみたいなものですね。
No.4
- 回答日時:
例えば、
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();
}
}
などとするかでしょうか?
この回答への補足
ありがとうございます。
>>継承を使って、サブクラスでスーパークラスと引数
>>と型が同じメソッドを宣言すると、オーバーライドに
>>なるので、戻り値が異なると互換性がないことになり
>>ます。
う~ん。そうですよね。
ご指摘いただいたように引数の型を変えるのも有効かと思うのですが,今回は他のクラスから同じメソッドを使う必要があるので、無理そうです・・・。
何か、他の手段を探して見ます。
お答えいただきありがとうございました。
どうやら、この方法では無理なようなので、違う方法を考えることにします。ありがとうございました。
No.3
- 回答日時:
互換性のない戻り値の型、のエラーですね。
もう少し詳しくやりたい事を教えてください。
キャストじゃダメなのかな?
この回答への補足
ありがとうございます。
>>互換性のない戻り値の型、のエラーですね。
そうです。そんな感じのエラーがでてました。
>>もう少し詳しくやりたい事を教えてください。
逆ポーランドの電卓を作りたいと考えています。
計算クラスがあり、そこには数字をプッシュ、ポップするといったメソッド
public void push(int a)
public int pop()
があり、それをJava標準ライブラリのスタッククラスを利用して記述したいのですが、スタッククラスのデータ型はオブジェクト型であるので、そのまま利用することはできませんよね。また、計算クラスは一切変更してはいけないといった条件もありますので、スタッククラスを継承したスタック2クラスを作成し、そこにint型のデータも扱えるようなメソッドを追加したいと考えています。
>>キャストじゃダメなのかな?
アダプタパターンを使うことが前提になっているので、
継承を必ずしなければならないようです。
お答えいただきありがとうございました。
どうやら、この方法では無理なようなので、違う方法を考えることにします。ありがとうございました。
No.2
- 回答日時:
できません。
できたらポリモーフィズムが壊れてしまいます。
継承をしなければいいのではないでしょうか?
この回答への補足
ありがとうございます。
>>継承をしなければいいのではないでしょうか?
やっぱり、継承をしないほうがいいですよね。しかし、アダプタパターンを用いることが条件になっているので、継承を使う必要があるそうです。
お答えいただきありがとうございました。
どうやら、この方法では無理なようなので、違う方法を考えることにします。ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) エクセルVBAで以下のようなコードを書いたらエラーになりました。何処が間違っているの教えて? 1 2023/02/10 18:30
- Visual Basic(VBA) エクセルVBAで教えて頂きたいのですが? 2 2022/12/31 20:28
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- Visual Basic(VBA) セルS2に入力した「月」と一致したB列の右隣へセルS110の値を転記する下記マクロを実行するとエラー 2 2022/12/06 17:32
- Visual Basic(VBA) ①ExcelVBAでカレンダーを作り、別のユザーフォームで日付を入力したいのですがエラーになります。 1 2023/02/17 18:39
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/17 18:41
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
- Visual Basic(VBA) 標準モジュール Public mOnTime As Date Sub sample() '実行プロシ 1 2023/02/22 15:44
- その他(プログラミング・Web制作) このプログラミングをどう組みますか? Googlecolabでやってるんですが、出来る方お願いします 1 2022/07/13 10:52
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る EXEの実行内容の結果によって、戻り値を0か1かで返したい 1 2023/07/04 16:40
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Java初級 引数に適用できません
-
レコード件数の表示
-
メソッド宣言の戻り値の型にク...
-
シェルスクリプトからのJavaメ...
-
StringBufferからStringへキャ...
-
getBinaryOutputStream()が使え...
-
getBunds()の使い方
-
クラスを作るとメソッドの数が...
-
C# 他のnamespaceにあるメソッ...
-
YYYYMMDD書式の日付に対する適...
-
C# 点の描き方をおしえてくだ...
-
メソッドの引数に指定されてい...
-
[クラス名].[メソッド名].[メソ...
-
Android 別javaファイルのメソ...
-
VB.Net: クラスの共有メソッド...
-
contextってなんですか?
-
System.out.print
-
クラス図→ソース
-
String.containsの反対機能はあ...
-
public static void main (Stri...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
レコード件数の表示
-
Java初級 引数に適用できません
-
String.containsの反対機能はあ...
-
abstract と static を一緒に付...
-
下記のリストならno002が含まれ...
-
Google Apps Script で getRang...
-
メソッド宣言の戻り値の型にク...
-
Strutsでチェックボックスの値...
-
StringBufferからStringへキャ...
-
readLine()ではじめから読み直...
-
javaに"search"という関数 or ...
-
なぜprotected overrideなのか
-
C# 点の描き方をおしえてくだ...
-
public static void main (Stri...
-
メソッドの引数に指定されてい...
-
別クラスのmainメソッドの実行
-
YYYYMMDD書式の日付に対する適...
-
C# の ByVal と ByRef について
-
Javaの関数名が長い?
-
Java初心者です、エラーの意味...
おすすめ情報