2017-04-09 5 views
-1

私は、RGBAバイトを渡して、コンストラクタのクラスにカスタムカラーを指定させたいと思っています。カスタムカラーが指定されていない場合は、アプリケーション設定のデフォルトカラーが使用されます。ただし、アルファが省略されている場合は、完全に不透明であると仮定します。オプションのバイト引数が渡されたかどうか確認してください

私は希望の何か:

public MyClass(byte r_col = -1, byte g_col = -1, byte b_col = -1, byte a_col = 255) 
{ 
    if (r_col == -1 | g_col == -1 | b_col == -1) 
    { 
     // use default color 
    } 
    else 
    { 
     this.color = System.Windows.Media.Color.FromArgb(a_col, r_col, g_col, b_col); 
    } 
} 

しかし、「間違っている」値はバイトのためにありません(-1無効である)ので、バイトが実際に関数に渡された場合、私は検出することができません。どのようなオプションがありますか?私は可能な場合、関数のオーバーロードを避けたいと思います。

+2

実際には、呼び出し元が無視されるいくつかの値を渡すことを許可するので、これは悪いAPIデザインです。例えば。呼び出し元がRとGだけを渡すとどうなりますか? RGBやRGBAは何も渡さないようにしてください。オーバーロードが必要です。 –

+0

良い点 - これはデフォルトの色を使用しています(エラーはありません)。ここでは、オーバーロードが最も完全な方法だと思います。 – Michael

答えて

1

関数のオーバーロードは、この場合にははるかに美しいです:もちろん

public MyClass() 
{ 
    //Default color 
} 
public MyClass(byte r_col, byte g_col, byte b_col) 
{ 
    color = Color.FromArgb(r_col, g_col, b_col); 
} 
public MyClass(byte a_col, byte r_col, byte g_col, byte b_col) 
{ 
    color = Color.FromArgb(a_col, r_col, g_col, b_col); 
} 

(マイケルがプルーフとして)なしでそれを行うことは可能であるが、それは(P.Kouverakisが述べた)優れたAPIの設計ではありません。ユーザーが許可されていないパラメータを入力できるようにすると、バグを追跡するのが困難になる可能性があるためです。より大きな結果のためにもっと多くの仕事を恐れることはない - この場合、関数のオーバーロードを使用する。

0

これは、C#にnull可能な型がある理由の1つと考えています。次のコードは、使用可能な引数が渡されたかどうかをチェックするためにNULL可能タイプを使用してうまく

public MyClass(byte? r_col = null, byte? g_col = null, byte? b_col = null, byte a_col = 255) 
{ 
    if (r_col == null | g_col == null | b_col == null) 
    { 
     // use default color 
    } 
    else 
    { 
     System.Windows.Media.Color.FromArgb(a_col, 
              r_col.GetValueOrDefault(), 
              g_col.GetValueOrDefault(), 
              b_col.GetValueOrDefault()); 
    } 
} 

これは自分の質問への答えである - 。他の提案も歓迎です。

+1

実際には、私は 'GetCalueOrDefault()'メソッドがここで必要とは思わない - '.Value'は前にチェックするので、それを行うべきです。しかし、なぜ正確に2つではなく1つの垂直バーを使用していますか?私はこれがうまくいくかどうかはわかりません... – MetaColon

+0

どちらの方法でも動作しますが、あなたの提案が少し速く実行されると思います。 – Michael

関連する問題