web-dev-qa-db-ja.com

オーバーロードされたメソッドに異なる戻り値の型を使用することは可能ですか?

メソッドのオーバーロードでは、オーバーロードされたメソッドに対して異なる戻り値の型を使用できますか?例えば、

void foo(int x) ;
int foo(int x,int y);
double foo(String str);

一般的なオブジェクト指向プログラミングでは可能ですか?

27

クラスでは、同じ名前を共有しているが異なる複数のメソッドが存在する可能性があります

  1. パラメータの種類
  2. パラメータ数
  3. メソッドで宣言されたパラメーターの順序

メソッドに提供されたパラメーターに応じて、実行時に、コンパイラーは実行するメソッドのバージョンを決定します。

オーバーロードされたメソッドには、異なる戻り値の型がある場合とない場合があります。ただし、コンパイラが実行時にどのメソッドを実行するかを判断するには、戻り値の型だけでは不十分です。

37

メソッドのオーバーロードとは、同じクラスに異なる引数を持つ同じ名前の2つ以上のメソッドを持つことを意味します。メソッドのオーバーロードの利点は、同じセマンティック操作をサポートするが、引数の数またはタイプが異なるメソッドを実装できることです。

重要なポイント

  • オーバーロードされたメソッドは引数リストを変更しなければなりません
  • オーバーロードされたメソッドは戻り値の型を変更できます
  • オーバーロードされたメソッドはアクセス修飾子を変更できます
  • オーバーロードされたメソッドは、新規またはより広範なチェック例外を宣言できます
  • メソッドは、同じクラスまたはサブクラスでオーバーロードできます
17
Sanshayan

同じパラメーターと異なるreturnタイプを持つメソッドを持つことはできません。コンパイラthrows error以下の場合(重複メソッド)。

方法1:

public int calc(int a, int b, int c)

方法2:

public String calc(int e, int f, int g)

スローされたエラー:

method calc(int, int, int) is already defined
17
Amarnath Rayudu

これはオーバーロードには無効です。パラメーターリストを変更することによってのみオーバーロードできます。戻り型はメソッドシグネチャの一部ではないため、戻り型のみをメソッドのオーバーロードに有効にすることはできません(メソッド名とパラメータリストのみがメソッドシグネチャに含まれています)。

2
Mohamed Ali

このようなことをしない限り:

int foo (int i, int has_default=0);
double foo (long l);
/* Skipping to the function call.  */
foo (1);

大丈夫です上記のコードは、いずれかの関数を呼び出そうとしている可能性があるため、問題が発生します。 C++を使用している場合、非常に悪くなる可能性があり、プリミティブまたは参照の代わりにポインターを返します...

1
Dustin
Integer doSomething(){return null;}
String doSomething(){return null;}

main(){
    doSomething()
}

この場合、コンパイラはどのメソッドが呼び出されるかを知ることはありません。

注-メソッドのオーバーロードはコンパイル時にチェックされます

1
bharanitharan

異なる戻り型の場合、メソッドのオーバーロードは不可能です。コンパイラが呼び出す必要のあるメソッドを把握できないためです。

1

はい、あなたによって与えられた例は可能ですc#でこの方法でメソッドのオーバーロードを行うことができます

void foo(int x)
    {
    }
    int foo(int x, int y)
    {
        return 0;
    }
    double foo(String str)
    {
        return 1;
    }
0
mihir patel

メソッドのオーバーロードをサポートするほとんどのプログラミング言語(Java、C#、C++など)では、パラメーターの型が異なる場合、戻り値の型も異なる場合があります。

0
Brett Kail

この素晴らしい答えを確認してください 戻り値の型による関数のオーバーロード?

要するに、ほとんどの静的に型付けされた言語はそうではありませんが、いくつかの動的に型付けされた言語は可能です。

編集:「要するに」答えは、戻り値のタイプによる厳密なオーバーロードに適用されます。他の人が指摘したように、パラメーターリストが異なり、コンパイラーによって解決できる場合、各メソッドは異なる型を返す可能性があります。戻り値は無視できず、コンパイラはこの情報を使用してメソッド呼び出しを解決できるため、ADAの戻り値の型によってのみメソッドをオーバーロードできますis

0
Dan Shield

C++ HearのVaradicテンプレート機能を使用できます。例:

template<typename T>
T adder(T v) {
  return v;
}

template<typename T, typename... Args>
T adder(T first, Args... args) {
  return first + adder(args...);
}

そして、ここに私たちがそれを呼ぶことができるいくつかの方法があります:

long sum = adder(1, 2, 3, 8, 7);

std::string s1 = "x", s2 = "aa", s3 = "bb", s4 = "yy";
std::string ssum = adder(s1, s2, s3, s4);

もっと参考にするために https://eli.thegreenplace.net/2014/variadic-templates-in-c/

0
Hardik