2009-12-20 64 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事件和一些多态?