3

メソッドをオーバーロードすることには本当に大きな利点がありますか?

次の例を考えてみましょう。

class SillyMath
{
    public static int Plus(int number1, int number2)
    {
        return Plus(number1, number2, 0);
    }

    public static int Plus(int number1, int number2, int number3)
    {
        return Plus(number1, number2, number3, 0);
    }

    public static int Plus(int number1, int number2, int number3, int number4)
    {
        return number1 + number2 + number3 + number4;
    }
}

パラメータをデフォルト値で使用する方が簡単ではないでしょうか?

public static int Plus(int number1, int number2, int number3 = 0, int number4 = 0)
        {
            return number1 + number2 + number3 + number4;
        }

1. では、プログラミング時にオーバーロードを考慮する必要がある理由を誰か教えてもらえますか?

2. 条件ステートメントを挿入する必要がある場合はどうすればよいですか? 過負荷は依然として関連しますか?

編集:また、一方で、オーバーロードも異なる戻り値の型を持つことができることを学びました。私の意見では、それがオーバーロードを考慮に値するものにするものです。

4

3 に答える 3

4

理由の 1 つは、さまざまな異なる入力を受け取る単一のメソッドのように見えるものを作成することです。たとえばBinaryWriter.Write、次のオーバーロード (およびその他のいくつか) があります。

Write(Boolean)
Write(Byte) 
Write(Byte[])   
Write(Char) 
Write(Char[])   
Write(Decimal)  
Write(Double)   
Write(Int16)    
Write(Int32)    
Write(Int64)    
Write(SByte)    
Write(Single)   
Write(String)   
Write(UInt16)   
Write(UInt32)   
Write(UInt64)

次のようなコードを記述できます。

bool   value1 = true;
int    value2 = 5;
double value3 = 5.5;
byte   value4 = 1;

using (BinaryWriter writer = GetABinaryWriter())
{
   writer.Write(value1);
   writer.Write(value2);
   writer.Write(value3);
   writer.Write(value4);
}
于 2012-08-11T11:23:48.893 に答える
3

オーバーロードは、デフォルト値を持つパラメータが に現れるずっと前に存在しますC#が、

では、プログラミング時にオーバーロードを考慮する必要がある理由を誰か教えてもらえますか?

パラメーターの多様性が大きくなる傾向がある場合 (私は主観的ですが、5 を超えると思います)、コードを読みやすくするため、s を使用することoverloadをお勧めします。

また、条件文を挿入する必要がある場合はどうすればよいでしょうか? 過負荷は依然として関連しますか?

あなたが求めているものは実際には得られませんが、異なるパラメーター値に基づいて例外をスローすることを意味していると思います。

if/elseif/elseこれは、オーバーロードを使用して、1つswitch/caseの大きな単一メソッドではなく、オーバーロードされたすべての関数に決定ロジックをローカライズする方が良い例です。

お役に立てれば。

編集

についてのあなたの最後のコメントに関してはどうですかnumber3

私は次のようなことを考えます:

///
///<int number3>A number for something not more then default value </int number3> //COMMENT
public void function(int number3Maximum = 100) //MAKE ESPLICIT EXPECTED MAXIMUM VALUE
{
   if(number3Maximum >100)
       throw new ArgumentOutOfRangeException("number3Maximum can not be more then default maximum"); 

     ..... //CODE
}
于 2012-08-11T10:15:41.917 に答える
1

私はあなたの言語で説明したいと思います

class SillyMath
    {
        public static int Plus(int number1, int number2)
        {
            return Plus(number1, number2, 0);
        }

        public static int Plus(int number1, int number2, int number3)
        {
            return Plus(number1, number2, number3, 0);
        }

        public static int Plus(int number1, int number2, int number3, int number4)
        {
            return number1 + number2 + number3 + number4;
        }
    }

ここで、2 人のユーザー A と B がいるとします。

A の要件は、43 と 45 の 2 つの数字を足すことです。

B の要件は、123、98、および 63 の 3 つの数字を足すことです。

引数が 2 つの関数、つまり int を使用する場合

Plus(int number1, int number2)

Bは次のようなコードを書いていましたPlus(123,Plus(98,63));

同様に、引数が 3 つの関数 A のコードは次のようになります。Plus(43,45,0);

これで、ある観点から見ると、両方のコードが汚れていることがわかります。そのため、プログラマーを容易にするために、タスクに追加のカスタマイズ機能を追加するオーバーロードされた関数が実装されることがあります。

  MessageBox.Show("You must enter a name.", "Name Entry Error",MessageBoxButtons.OK, MessageBoxIcon.Exclamation);

MessageBox なし
"Name Entry Error",MessageBoxButtons.OK,MessageBoxIcon.Exclamationで使用できますが、見逃しているのはカスタマイズだけであり、デフォルトの形式で表示されます。

于 2012-08-11T10:29:14.030 に答える