2009-12-20 63 views
1

這裏是我的方法:替代寫許多if語句?

private void ConvertValues() 
{ 
    txtResult.Text = angles[cmbUnits1.SelectedIndex]; 
    double value1 = Convert.ToDouble(txtValue1.Text); 
    double value2 = Convert.ToDouble(txtValue2.Text); 
    int unit1 = cmbUnits1.SelectedIndex; 
} 

我想做什麼方法是讓所選擇的組合框的和測試值。但我想知道是否有這個替代:

if(angles[cmbUnits1.SelectedIndex].Equals("Degrees") && 
    angles[cmbUnits2.SelectedIndex].Equals("Radians")) { 
    ... 
} 

順便說一句,我在做一種單位換算的,所以我會比角度其他部分。所以我想要一些我可以實現的枚舉,接口,抽象類或類。也許一個名字爲Unit?的班級?所以我可以用Units創建一個新對象,如Unit degrees = new Unit(Units.Angle)。或者只是Unit sqrMillimeters = new Unit("Area");

+1

看看markdown語法,下次您在SO上發佈答案或問題時:http:// stackoverflow。com/editing-help – 2009-12-20 19:10:34

回答

9

當然,多態性。每當你看到長開關語句或者/ then/else結構時,總是可以用多態和工廠來處理它們。在你的情況下,我會想象一個具有華氏溫度,Celcius,Kelvin和Rankine的具體實現的IT溫度轉換接口將會很好地實現。

UPDATE:

如果你發現你有這樣的邏輯重複,爲什麼不能有超過一個雙重的角度更好的抽象?

如果您使用面向對象的語言編寫代碼,那麼最好在基元之上(例如double和yes,string)將行爲封裝到對象中。

我會考慮一個角度類,它會掛在這個值上,並將它作爲你想要的任何度量返回。

下面是在Java中執行此操作的一種方法。我將把譯文留給C#,其餘的給你。

package angles; 

public class Angle 
{ 
    private double value; 
    private AngleUnit units; 

    public Angle() 
    { 
     this(0.0, AngleUnit.RADIANS); 
    } 

    public Angle(double value) 
    { 
     this(value, AngleUnit.RADIANS); 
    } 

    public Angle(double value, AngleUnit units) 
    { 
     this.value = value; 
     this.units = units; 
    } 

    public double getValue() 
    { 
     return value; 
    } 

    public AngleUnit getUnits() 
    { 
     return units; 
    } 

    public Angle convert(AngleUnit newUnits) 
    { 
     Angle newAngle = null; 

     if (this.units.equals(newUnits)) 
     { 
      return this; 
     } 

     return newAngle; 
    } 
} 

package angles; 

public interface AngleConverter 
{ 
    Angle convert(Angle angle, AngleUnit to); 
} 

package angles; 

public enum AngleUnit 
{ 
    DEGREES, RADIANS, GRADIANS; 
} 

package angles; 

import java.util.HashMap; 
import java.util.Map; 

public class DegreeConverter implements AngleConverter 
{ 
    private final Map<AngleUnit, Double> factors; 

    public DegreeConverter(Map<AngleUnit, Double> factors) 
    { 
     this.factors = new HashMap<AngleUnit, Double>(); 
     this.factors.put(AngleUnit.DEGREES, 1.0); 
     this.factors.put(AngleUnit.RADIANS, Math.PI/180.0); 
     this.factors.put(AngleUnit.GRADIANS, 100.0/90.); 
    } 

    public Angle convert(Angle angle, AngleUnit to) 
    { 
     assert angle != null && to != null; 

     return new Angle(angle.getValue()*this.factors.get(to), to); 
    } 
} 
+0

(那裏,爲您解決這個問題。) – 2009-12-20 19:18:33

+1

我認爲數量是角度而不是溫度:-)但邏輯是相同的 – 2009-12-20 19:19:45

+0

您可以發佈代碼示例或示例嗎? – 2009-12-20 19:56:26

3

double UnitToFactor(string unit) { returns 1 for radians, pi/180 for degrees, etc }

那麼

ratio = UnitToFactor(unit1)/UnitToFactor(unit2);

dest = src*ratio

這種方式,而不是N^2,如果()語句中,u只有N.

1

是否有任何你可以寫一個switch聲明嗎?

switch (something) 
{ 
    case "degrees" : do work 
    ...etc 
} 
+0

多態也是一種很好的方式,因爲duffymo已經建議 – Jason 2009-12-20 19:11:02

+0

也許,但我必須擁有依賴的switch語句。沒有太大的不同,如果elseif – 2009-12-21 04:01:51

0

你可以通過反射串聯兩個字符串(「DegreesRadians」),並調用了一個名爲「DegreesRadians」方法:

MethodInfo theMethod = thisType.GetMethod(methodName); 
theMethod.Invoke(this, parameters); 

其中MethodName是連接的字符串(可能與附加信息,如「轉換「+ unit1 +」2「+ unit2,如」convertDegrees2Radians「),參數是包含兩個值的數組。

1

如何組合SelectedIndexChanged/SelectedValueChanged事件和一些多態?