这是我的方法:
private void ConvertValues()
{
txtResult.Text = angles[cmbUnits1.SelectedIndex];
double value1 = Convert.ToDouble(txtValue1.Text);
double value2 = Convert.ToDouble(txtValue2.Text);
int unit1 = cmbUnits1.SelectedIndex;
}
我想要的方法是获取所选的ComboBox并测试值。但我想知道是否有替代方案:
if( angles[cmbUnits1.SelectedIndex].Equals("Degrees") &&
angles[cmbUnits2.SelectedIndex].Equals("Radians")) {
...
}
顺便说一下,我正在制作一种单位转换器,所以我会有除角度以外的部分。所以我想要一些我可以实现的枚举,接口,抽象类或类。也许是一个名为Unit的班级?所以我可以用单位作为枚举来创建像Unit degrees = new Unit(Units.Angle)
这样的新对象。或者只是Unit sqrMillimeters = new Unit("Area");
?
答案 0 :(得分:9)
当然,多态性。任何时候你看到很长的switch语句或if / then / else构造它总是可以使用多态和工厂来处理它们。在你的情况下,我想象一个ITemperatureConverter接口,具有Fahrenheit,Celcius,Kelvin和Rankine的具体实现,可以很好地完成。
更新:
如果你发现你重复了这个逻辑,为什么没有一个更好的抽象角度而不是双倍?
如果您正在使用面向对象的语言编写,那么最好将原语(例如,double和,是的,字符串)升级为将行为封装到对象中。
我会考虑一个会挂在值上的Angle类,并将其作为您想要的任何度量返回。
这是在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);
}
}
答案 1 :(得分:2)
double UnitToFactor(string unit) { returns 1 for radians, pi/180 for degrees, etc }
然后
ratio = UnitToFactor(unit1) / UnitToFactor(unit2);
和dest = src*ratio
这样,代替N ^ 2 if()语句,你只有N。
答案 2 :(得分:1)
你有什么方法可以写一个switch
声明吗?
switch (something)
{
case "degrees" : do work
...etc
}
答案 3 :(得分:1)
SelectedIndexChanged / SelectedValueChanged事件和某些多态的组合怎么样?
答案 4 :(得分:0)
您可以连接两个字符串(“DegreesRadians”)并通过反射调用名为“DegreesRadians”的方法:
MethodInfo theMethod = thisType.GetMethod(methodName);
theMethod.Invoke(this, parameters);
其中methodName是连接字符串(可能带有附加信息,如“convert”+ unit1 +“2”+ unit2,如“convertDegrees2Radians”),而参数是包含两个值的数组。