2012-09-14 14 views
5

同じパラメータを使用していても意味の異なる2つの同じ関数名を使用できますか。例えば関数のオーバーロード

public void test(string name) 

public void test(string age) 

ありがとうございました。

+0

もちろん、「年齢」を['TimeSpan'](http://msdn.microsoft.com/en-us/library/system.timespan.aspx)として表現すると、これは問題。 – Rawling

+0

@Rawlingまたは実際には、数値型の任意の形式で十分です。 =) –

+0

は、 'string args'のような共通のパラメータを持っています –

答えて

4

いいえ、できません。シグネチャは違いはありません。パラメータ名が何であるかは関係ありません。

方法は、そのような、そのような抽象的または密閉され、戻り値、メソッドの名前、および任意のメソッドパラメータとして、パブリックまたはプライベート、オプションの改質剤としてのアクセスレベルを指定することにより、クラスまたは構造体で宣言されています。これらの部分が一緒になってメソッドのシグネチャです。いくつかの他の回答のように

http://msdn.microsoft.com/en-us/library/ms173114.aspx

あなたが取っているデータの種類を考慮し、述べた。名前は確かに一般的な文字列ですが、年齢がでなければならないのでしょうか?それを許可する場合 - たとえば - intあなたはあなたの望むようにメソッドをオーバーロードすることができます。

1

Signatures and Overloading

あなたが別の名前のメソッドを作成することはありません、なぜ異なる意味を持つメソッドが必要な場合は?同じオブジェクトの異なるものに同じメソッド名を使用するのは混乱します。

3

いいえ、戻り値の型またはパラメータ名でオーバーロードすることはできません。他の言語とは異なり(特にObjective C )、パラメータ名は関数の署名の一部ではありません。

メソッドのシグネチャは、左から右へ順番に考慮その仮パラメータの各々のメソッドの名前とタイプと種類(値、参照、または出力)、から成ります。メソッドのシグネチャには、戻り値の型は含まれておらず、右端のパラメータに指定できるparams修飾子も含まれていません。でもそこ


それはまさに、セレクタの一部となり、パラメータの名前ではありません。

+0

+1、Objective C – PeteH

2

静的メソッドと非静的メソッドを同じ名前にできますが、メソッドオーバーロードと同じ規則に従って異なるパラメーターを使用することはできますが、まったく同じシグネチャを持つことはできません。

+0

に興味深い洞察力があります。しかし、メンテナンスに関しては悪い考えです! – PeteH

1

あなたは、オプションのパラメータとデフォルト値を使用して一緒にこれらのメソッドを混ぜることができます:

public void test(string name = null, string age = null) 
{ 
    if (name != null) 
    { 
    // Do something 
    } 
    else if (age != null) 
    { 
    // Do something else 
    } 
} 

をそして、あなたはそのように、このメソッドを呼び出すことができます。

test(name: "John"); 
test(age: "30"); 

非常にきれいで、まだ使用可能ではありません。

0

いいえ - 戻り値の型ではなく、どのメソッドを呼び出すかをコンパイラのパラメータで判断するため、コンパイラはエラーをスローします。

0

いいえ。

OVERLOADED FUNCTIONのシグネチャは、と異なる必要があります。 ie-引数は、引数の数または異なるデータ型引数の順序の点で異なる必要があります。

関連する問題