4

だから私はちょうど関数のオーバーロードについて考えています...

オーバーロードされたメソッドは同じ名前を共有しますが、一意の署名を持ちます。パラメータの数、パラメータのタイプ、またはその両方が異なる必要があります。異なる戻り値の型だけに基づいて関数をオーバーロードすることはできません。

setNameでは、次の例では、ミドル ネームとラスト ネームの値にオプションのパラメーターを使用するのではなく、オーバーロードする必要があるのはなぜでしょうか?

class funOverload
{
    public string name;

    //overloaded functions
    public void setName(string last)
    {
        name = last;
    }

    public void setName(string first, string last)
    {
        name = first + "" + last;
    }

    public void setName(string first, string middle, string last)
    {
        name = first + "" + middle + "" + last;
    }

    //Entry point
    static void Main(string[] args)
    {
        funOverload obj = new funOverload();

        obj.setName("barack");
        obj.setName("barack "," obama ");
        obj.setName("barack ","hussian","obama");

    }
}

少なくとも、以下を使用すると、記述する必要があるコードの量が削減されます。

public void setName(string first, string middle = "", string last = "")
{
   name = first + "" + middle + "" + last;

   // name = "barack" + "" + "";
}

//Entry point
static void Main(string[] args)
{
    funOverload obj = new funOverload();

    // could optionally set middle and last name values here as well
    obj.setName("barack");
 }

オーバーロードの概念は理解していますが、オプションのパラメーターを使用するよりも望ましいオプションである理由がわかりません (またはその逆)。

誰でも説明できますか?

参考までに、私がオーバーロードした最初の関数を次に示します: http://pastebin.com/ynCuaay1
この関数を使用するとMySqlContext.GetReader()、パラメーターのリストの有無にかかわらず呼び出すことができます...呼び出す必要があるよりもコードがずっときれいになったと思いましたGetReader(sql, args.ToArray())ずっと

4

2 に答える 2

0

あなたの例では、3 つのオーバーロードはオプションのパラメーターを持つメソッドと同等ではありません。 setName(string last)は、与えられた最小データは姓であると述べていますが、public void setName(string first, string middle = "", string last = "")では名を省略できません。オプションのパラメーターを使用してメソッドの呼び出しでミドルネームを省略したい場合は、setName("barack", last: "obama").

次のようなオプションのパラメーターを持つメソッドを使用することをお勧めします。

public void setName(string last, string first= "", string middle = "")

setName("barack", middle: "hussein");しかし、これは名前の自然な順序を台無しにし、3 つのオーバーロードで禁止されている最初の ( ) を指定せずにミドル ネームを設定できるようにします。

于 2013-05-28T10:21:16.453 に答える