5

重複:戻り値の型による関数のオーバーロード?


これは非常にばかげた質問かもしれませんが、戻り値の型が異なる場合に同じシグネチャを持つ 2 つのメソッドを宣言できない理由がわかりません。

public class MyClass
{
    private double d = 0;

    public double MyMethod()
    {
        return d;
    }

    public string MyMethod()
    {
        return d.ToString();
    }
}

クラスが同じパラメーター型のメンバーを既に定義していることを示すコンパイル エラーが発生します。

(明らかに、私のコードでこれを使用している方法は、私のコード例ほど単純ではありません...しかし、アイデアが伝わると思います。)

私が行おうとしているものを OOP アンチパターンにする OO 設計に関する何かが欠けていますか? 確かに、どのメソッドが必要かを具体的に伝える限り、コンパイラはどのメソッドを使用しようとしているかを判断できるはずです。

MyClass myClass = new MyClass();のコードが機能することを期待するとします。

double d = myClass.MyMethod();
string s = myClass.MyMethod();

次のコードには問題があると思います。

var v = myClass.MyMethod();

ただし、その場合でもvarコンパイルエラーになるはずです。

ここで私が間違っていることを誰かが見ることができますか? 訂正していただけるとさらに嬉しいです。:-)

4

5 に答える 5

20

それは型強制のためです。

次の関数があるとします。

int x(double);
float x(double);

double y = x(1.0);

では、特に 2 つのまったく異なることを行う場合、2 つのプロトタイプのどちらを呼び出す必要がありますか?

基本的に、言語設計の早い段階で、関数名と引数のみを使用して実際に呼び出される関数を決定するという決定が下されました。新しい標準が到着するまで、私たちはそれに固執しています。

さて、あなたはあなたの質問にタグを付けましたが、あなたC#が提案したことを実行できる言語を設計することに何の問題もないと思います. 1 つの可能性は、上記のようなあいまいなコマンドにエラーとしてフラグを立て、キャストなどで呼び出すコマンドをユーザーに指定させることです。

int x(double);
float x(double);
double y = (float)(x(1.0));    // overload casting
double y = float:x(1.0);       // or use new syntax (looks nicer, IMNSHO)

これにより、コンパイラは正しいバージョンを選択できるようになります。これは、他の回答が提起したいくつかの問題に対しても機能します。あいまいにすることができます:

System.out.Println(myClass.MyMethod());

具体的に:

System.out.Println(string:myClass.MyMethod());

C#これは、標準プロセスにそれほど遠くない場合に追加される可能性があります (Microsoft は耳を傾けCます) C++。拡張機能として実行するgcc方が簡単かもしれません。

于 2009-02-25T04:01:04.320 に答える
6

戻り値の型を「キャプチャ」せずにメソッドを呼び出すのを止めることはできません。あなたがこれを行うのを止めることは何もありません:

myClass.MyMethod();

その場合、コンパイラはどれを呼び出すべきかをどのように知るのでしょうか?

編集:それに加えて、C# 3.0 でvarを使用できる場合、コンパイラは、これを行うときに呼び出しているメソッドをどのように認識しますか:

var result = myClass.MyMethod();
于 2009-02-25T04:01:03.977 に答える
1

メソッドを呼び出すとき、戻り値の型はそれほど重要ではないためです。戻り値の型だけが異なるメソッドを使用すると、多くの場合あいまいさが生じます。結果を変数にまったく保存しないか、次のようなことを行う場合があります。

System.out.Println(myClass.MyMethod());

コンパイラは、どのメソッドを呼び出したいかを判断する方法がありません。

于 2009-02-25T04:04:42.003 に答える
0

メソッド シグネチャは、名前と入力パラメーター (型と順序) のみです。戻り値の型は署名の一部ではありません。したがって、同じ名前と入力パラメーターを持つ 2 つのメソッドは同一であり、互いに競合します。

于 2009-02-25T04:00:47.083 に答える
0

メソッドを割り当てる変数は、使用するメソッドをコンパイラに通知できません。想像:

文字列メッセージ = "結果 = " + myClass.MyMethod();

于 2009-02-25T04:01:15.990 に答える