gpt4 book ai didi

c# - 替代编写许多 if 语句?

转载 作者:太空宇宙 更新时间:2023-11-03 17:23:01 24 4
gpt4 key购买 nike

这是我的方法:

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

我希望该方法执行的操作是选择 ComboBoxes 并测试值。但我想知道是否有替代方案:

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

顺便说一下,我正在制作一种单位转换器,所以我会有角度以外的部分。所以我想要一些我可以实现的枚举、接口(interface)、抽象类或类。也许是一个名为 Unit 的类(class)?因此,我可以创建新对象,如 Unit degrees = new Unit(Units.Angle),并将 Units 作为枚举。或者只是 Unit sqrMillimeters = new Unit("Area");

最佳答案

当然,多态性。每当您看到长的 switch 语句或 if/then/else 构造时,总是可以使用多态性和工厂来处理它们。在你的情况下,我想一个 ITemperatureConverter 接口(interface)与华氏度、摄氏度、开尔文和朗金的具体实现会做得很好。

更新:

如果您发现您重复了此逻辑,为什么不对 Angle 进行比 double 更好的抽象?

如果您使用面向对象的语言编写代码,最好超越原语(例如,double 和,是的,string),将行为封装到对象中。

我会考虑一个 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);
}
}

关于c# - 替代编写许多 if 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1936636/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com