2013-07-05 89 views
1

我試圖在C#中用RGB創建類Color,顏色值(紅色,綠色,藍色)必須在範圍[0,1]內。
這是我的代碼在C#中創建類RGB顏色#

public class ColorRGB 
    { 
     private ColorRGB(double _red, double _green, double _blue) 
     { 
      Red = _red; 
      Green = _green; 
      Blue = _blue; 
     } 

     public static ColorRGB ColorRGB_RGBModel(double _red, double _green, double _blue) 
     { 
      return new ColorRGB(_red, _green, _blue); 
     } 

     public static ColorRGB ColorRGB_CMYModel(double _cyan, double _magenta, double _yellow) 
     { 
      var _red = 1 - _cyan; 
      var _green = 1 - _magenta; 
      var _blue = 1 - _yellow; 
      return new ColorRGB(_red, _green, _blue); 
     } 

     public ColorRGB AddRGB(ColorRGB _secondColor) 
     { 
      return ColorRGB_RGBModel(this.Red + _secondColor.Red, this.Green + _secondColor.Green, this.Blue + _secondColor.Blue); 
     } 

     public ColorRGB SubtractRGB(ColorRGB _secondColor) 
     { 
      return ColorRGB_RGBModel(this.Red - _secondColor.Red, this.Green - _secondColor.Green, this.Blue - _secondColor.Blue); 
     } 

     public double Red { 
      get { return red; } 
      private set { red = red < 0 ? 0 : (red > 1 ? 1 : value); } 
     } 
     public double Green 
     { 
      get { return green; } 
      private set { green = green < 0 ? 0 : (green > 1 ? 1 : value); } 
     } 
     public double Blue 
     { 
      get { return blue; } 
      private set { blue = blue < 0 ? 0 : (blue > 1 ? 1 : value); } 
     } 
     public double Cyan 
     { 
      get { return cyan; } 
      private set { cyan = cyan < 0 ? 0 : (cyan > 1 ? 1 : value); } 
     } 
     public double Magenta 
     { 
      get { return magenta; } 
      private set { magenta = magenta < 0 ? 0 : (magenta > 1 ? 1 : value); } 
     } 
     public double Yellow 
     { 
      get { return yellow; } 
      private set { yellow = yellow < 0 ? 0 : (yellow > 1 ? 1 : value); } 
     } 

     private double red; 
     private double green; 
     private double blue; 
     private double cyan; 
     private double magenta; 
     private double yellow; 
    } 
} 

,但是當我試圖創建這個類的一個實例,並試圖建立的顏色(紅,貪婪,藍)值超出範圍[0,1],我checkings red = red < 0 ? 0 : (red > 1 ? 1 : value);和其他人沒有工作。
有人可以解釋我爲什麼會發生,以及如何解決這個問題?

回答

7

使用value越來越少red

public double Red { 
    get { return red; } 
    private set { red = value < 0 ? 0 : (value > 1 ? 1 : value); } 
} 

此刻,你正在檢查的當前值的局部變量,而不是在用戶試圖設置的值。 (同樣,對於所有其他set方法 - 你正在檢查的局部變量,其中包含了舊值是關於要更換 - 而不是value參數)


我也不清楚爲什麼你CMY屬性/變量,當它們被構造函數忽略時,並且從不與RGB值相關 - 但也許這就是您尚未編寫的代碼。


至於建議的Izzy,你可以添加一個功能,你的方法:

private static double Bound(double value) { 
    return value < 0 ? 0 : (value > 1 ? 1 : value); 
} 

,然後重新寫你的制定機構:

private set { red = Bound(value); } 

這將使你的代碼看起來清潔劑

+2

我打算建議將邊界檢查分解爲它自己的函數以使測試更容易..但是這是答案: ) – Izzy

+0

非常感謝,現在它工作! – Heidel

+0

@Izzy謝謝你,這是非常有趣的想法! – Heidel