创建支持不同单位的温度等级(摄氏度,华氏度,开尔文度)

时间:2016-08-11 10:54:57

标签: c# .net oop temperature

我正在上课,帮助我在单位之间进行转换,我需要询问创建这项工作的最佳方法。

这是关于温度的示例代码:

        public class Temperature
{
    private double _Celsius = 0;
    public double Celsius
    {
        get { return _Celsius; }
        set
        {
            _Fahrenheit = (value * 9 / 5) + 32;
            _Kelvin = value + 273.15;
        }
    }
    private double _Fahrenheit = 0;
    public double Fahrenheit
    {
        get { return _Fahrenheit; }
        set
        {
            _Celsius = (value - 32) * 5/9;
            _Kelvin = _Celsius + 273.15;
        }
    }
    private double _Kelvin = 0;
    public double Kelvin
    {
        get { return _Kelvin; }
        set
        {
            _Celsius = value - 273.15;
            _Fahrenheit = (_Celsius * 9 / 5) + 32;
        }
    }
}

我希望知道这个班级是否还有其他好的一个?

3 个答案:

答案 0 :(得分:3)

为什么只有一个(例如_Celsius)足够三个字段_Fahrenheit_Kelvin_Celsius

  public class Temperature {
    private double _Celsius

    public double Celsius {
      get {
        return _Celsius;
      }
      set {
        // Simplest: no validation (e.g. -500 degree is an evident error)
        _Celsius = value;
      } 
    }

    public double Kelvin {
      get { 
        return Celsius + 273.15;
      }  
      set {
        Celsius = value - 273.15;
      } 
    }

    public double Fahrenheit {
      get { 
        return Celsius * 9 / 5 + 32;
      }  
      set {
        Celsius = (value - 32) * 5 / 9;
      } 
    }
  } 

现在让我们考虑一下使用常规的预期方法是什么?例如。我想将100 Fahrenheit 转换为 Kelvin

  double result = new Temperature() { Fahrenheit = 100.0 }.Kelvin;
有点罗嗦和反直觉,对吗?可能是一个更好的选择是实现一堆static method s?并且根本不创建任何课程?

  public static class Temperatures {
    public static double FahrenheitToCelsius(double value) {...} 

    public static double CelsiusToKelvin(double value) {...}

    public static double FahrenheitToKelvin(double value) {
      return CelsiusToKelvin(FahrenheitToCelsius(value)); 
    }
    ...
  } 

  ...

  double result = Temperatures.FahrenheitToKelvin(100.0); 

答案 1 :(得分:3)

温度基本上是一种复杂的数字。"它可以用不同的测量单位来衡量,但最终你仍然应该能够比较两个不同的温度,以确定它们是否相等,或者一个是否超过"另一个。您可能还想添加两个温度或减去它们。

我看到这个类的行为类似于.NET提供的TimeSpan类。你的温度等级'实施将选择一个单独的计量单位私人使用 - 让凯尔文说。温度然后提供方便"属性,以任何您想要的测量单位(华氏度或摄氏度)提供温度:

public class Temperature
{
    private double _kelvin = 0.0;
    public double Kelvin
    { 
        get { return _kelvin; }
        set { _kelvin = value; }
    }

    public double Fahrenheit 
    {
        get { return /* convert Kelvin to Fahrenheit */; }
        set { _kelvin = /* convert Fahrenheit to Kelvin */; }
    }


    public double Celsius
    {
        get { return /* convert Kelvin to Celsius */; }
        set { _kelvin = /* convert Celsius to Kelvin */; }
    }
}

此外 - 与TimeSpan类一样 - 您将需要静态方法,使您可以使用任何"基础测量"快速轻松地创建温度实例。你当时喜欢的单位:

/* Also inside the Temperature class: */
public static Temperature FromKelvin(double kelvin)
{
    var temperature = new Temperature();
    temperature.Kelvin = kelvin;
    return temperature;
}

public static Temperature FromFahrenheit(double fahrenheit)
{
    var temperature = new Temperature();
    temperature.Fahrenheit = fahrenheit;
    return temperature;
}

public static Temperature FromCelsius(double celsius)
{
    var temperature = new Temperature();
    temperature.Celsius = celsius;
    return temperature;
}

使用这种方法,您可以使用一些很好的干净用法语法;

var myTemperatureInKelvin = Temperature.FromCelsius(100.0).Kelvin;

最后 - 要从这样的类中获得一些真正的 - 你需要implement comparison and arithmetic operators获得相等,大于和小于比较,加法,减法等。这使您可以非常干净地比较或添加多个温度;

var resultInFahrenheit = (Temperature.FromCelsius(100.0) + Temperature.FromKelvin(200.0)).Fahrenheit;

疯狂!而且很有用!

答案 2 :(得分:0)

我猜你可能不想加载温度对象,你只想将一个数字转换为另一个数字。所以我会考虑将温度设为静态类,即

public static Temperature

所以你可以写一个类似

的方法
public static double GetKelvinFromCelsius(double celsius) {
     return (celsius + 273.15);
}

可以使用:

double kelvinTemperature = Temperature.GetKelvinFromCelsius(400);