2011-07-09 11 views
4

これは特定のプログラミング疑惑ではなく一般的なプログラミングの疑いです。しかし、私は例を挙げてそれを述べる。私自身のMessageBoxクラスを作成していて、.Show()メソッドを21のオーバーロードで実装したいとします。私は以下のようにこれを行うことができます。C#でメソッドのオーバーロードを作成する簡単な方法はありますか?

public static void Show(string x){} 
public static void Show(int x){} 
public static void Show(param x){} 
public static void Show(param2 x){} 
public static void Show(string x, param y){} 
. 
. 
. 
. 
public static void Show(param x, param y){} 

このような方法を書くことはかなり面倒です。これを行う簡単な方法はありますか?何かのように、

public static void Show(string x, string y, int i, param p, ...... param21st z) 
{ 
    if (//see the arguments and decide) 
     //do stuff ignoring rest of the arguments; 
    else if (//passed arguments are of these type) 
     //then do this stuff. 
    else if (so and so) 
     // so and so. 
} 

注:私はそれはそれは別に書かれた21種類の関数のサイズを超えることができ、私の一つの機能はそれほど大きくすることはないだろうのような引数があることを知ってい 1。いいえ、私のケースでは、別々に書くことは、私が関数の下で実行する必要があることが非常に自明であることを考慮すると、より大きな面倒です(関数が多数のパラメータを取ることができるだけです)。さらに、この問題は、異なるコーディングテクニックについて知ることでもあります。 2.私が探している簡潔なスタイルは、私の場合、自分のために作っている趣味のプログラムのために、そのデメリットがあることを理解しています。それでは使い勝手の問題ではありません。ちょうど私は.Show()メソッドを実行する必要があります。 (これにより、別々の関数を書くのが面倒になる)。

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

+1

これはこれを行う方法です。 .NETソースを見ると、マイクロソフトではほとんどのAPIで同じことをしています。 1つのメソッドに大量のパラメータを渡すことはひどい考えです。メソッドを正常に実行するには実際に何が必要なのか把握するのが難しいので、一般的にメンテナンスの悪夢です。さまざまな値が渡される異なるケースに対して、パラメータビルダとして機能するオブジェクトのセットを作成することができます(より良い用語がないため)。 –

+0

@Sergey Akopovはい私はそれを完全に理解しています。ありがとうございました。私の場合、趣味のプログラムのために私は自分のために作成しています。それでは使い勝手の問題ではありません。私は実装にもっと興味があります。私はあなたのコメントの2番目の部分を理解していませんでした。私はコードを参照する必要があります.. – nawfal

+0

あなたは趣味のプログラムのために書くコードでユーザビリティはまだ重要です - あなたが数ヶ月または数年後にコードに戻ったらどうなりますか? –

答えて

4

私が見る2つの良いオプションは次のとおりです:1.オプションのパラメータ、および2.必要に応じてメソッドを呼び出すこと。両方とも、書かなければならないコードの量を大幅に削減します。

optional parameters(VS 2010以降)の例を示します。 string x = ""では、xのデフォルトは""です。デフォルトはコンパイル時定数でなければなりません。あなたはそれを呼び出す

public static void Show(string x = "", string y = null, int i = 0, param p = null, ...... param21st z = null) 
{ 
    if (//see the arguments and decide) 
     //do stuff ignoring rest of the arguments; 
    else if (//passed arguments are of these type) 
     //then do this stuff. 
    else if (so and so) 
     // so and so. 
} 

、あなたはすべてのパラメータが含まれていない場合、それはあなたが何であるかをコンパイラには自明ですので、あなたがそれらに名前を付ける必要があるかもしれませんし、指定されていません。

CustomMessageBox.Show(x: "hi", y: "there", p: myObject); 

これは実際にはコンパイラのトリックで、含まれていないすべてのパラメータをデフォルト値で自動的に埋め込みます。

もう1つの方法は、メソッドが可能な限り互いに呼び出すようにすることです。そうすれば、コードを21回複製するのではなく、実行できる主な方法がいくつかあります。

public static void Show(string x){Show(x, null);} 
public static void Show(int x){//do something} 
public static void Show(param x){Show(string.Empty, x);} 
public static void Show(param2 x){//do something} 
public static void Show(string x, param y){//do something} 

このようにそれを行うことの利点は、あなたがそのようなオブジェクトの新しいインスタンスまたは静的な読み取り専用のものとして、定数以外のものを渡すことができるということです。

+0

素晴らしいもの!私はこの答えに印を付ける気にしなかった。私はこれを試してみましょう。ロジックの素晴らしい部分.. – nawfal

+0

彼らはVS2010で新しいですか?私は別のプログラミング言語(VB6-D :)を考えていない限り、過去にそれらを使用したと確信しています。 –

+0

オプションのパラメータは本当の宝石です。あなたが気付いていないなら、その美しさは、注文が維持されているならば、私たちが普通にやっているようなものを指定せずにパラメータを渡すことさえできます。このように、たとえば、 'CustomMessageBox.Show(" hi "、" there ");'または 'CustomMessageBox.Show(" hi "、" there "、p16:myObject);' ...すべてを指定する必要はありません – nawfal

5

これは可能ですが、関数のパラメータの種類を知る必要があります。

public static void Show(params object[] values) 
{ 
    if(values[0] == "something") 
    //Do stuff 
} 
+0

私はそれを検討しています。 – nawfal

+0

@Magnusでは、型を知る必要はありません。あなたは 'GetType()'を使ってそれらを見つけることができます。 – svick

+0

@svick確かに、私が意図したことは、関数のロジックを行うためには、特定の値を期待して特定のインデックスに入力する必要があるということでした。 – Magnus

関連する問題