Distance d = new Distance;
d.Meters = 5000;
var km = d.Kilometers; // km = 5;
或者,您可以为每个单元创建类:
public sealed class DistanceUnit
{
public DistanceUnit(string name, string symbol, double scale)
{
Name = name;
Symbol = symbol;
Scale = scale;
}
public string Name { get; private set; }
public string Symbol { get; private set; }
public double Scale { get; private set; }
}
public abstract class Distance
{
protected Distance(double value)
{
this.Value = value;
}
protected Distance()
{
}
public double Value { get; set; }
public abstract DistanceUnit Unit { get; }
public override string ToString()
{
return this.Value + " " + Unit.Symbol;
}
public static void Convert<TIn, TOut>(TIn original, out TOut result)
where TIn : Distance, new()
where TOut : Distance, new()
{
result = new TOut();
var scale = result.Unit.Scale / original.Unit.Scale;
result.Value = original.Value * scale;
}
}
public sealed class Meter : Distance
{
private static readonly DistanceUnit s_Unit = new DistanceUnit("Meter", "m", 1);
public Meter(double value) : base(value)
{
}
public Meter()
{
}
public override DistanceUnit Unit
{
get { return s_Unit; }
}
}
public sealed class Kilometer : Distance
{
private static readonly DistanceUnit s_Unit = new DistanceUnit("Kilometer", "km", .001);
public Kilometer()
{
}
public Kilometer(double value)
: base(value)
{
}
public override DistanceUnit Unit
{
get { return s_Unit; }
}
}
它的用途就像
Meter distanceHome = new Meter(10000);
Kilometer distanceInKMs;
Distance.Convert(distanceHome, out distanceInKMs); // distanceInKMs.Value = 10
UnitValue a, b, c;
a = new UnitValue(3 * 5280, Feet);
b = new UnitValue(180, Seconds);
c = (a / b).As(Miles / Hours);
cout << c;
应该可以打印出类似于
60 miles/hour
因此,您可以看到,将一个UnitValue除以另一个UnitValue应该产生一个具有复合单位的新UnitValue-在本例中,a / b应该产生一个单位为Feet per Seconds(英尺/秒)的UnitValue,然后转换例程As将其转换为其他值,在本例中为miles per hour。 我希望这有助于激发你的一些思考。 分享和享受。
4条答案
按热度按时间ru9i0ody1#
首先想到的是使用System.TimeSpan,其中同一个类表示时间,您可以通过属性以不同的单位访问它。
你可以在内部以某个常量单位(大概是SI)存储值,并在属性getter / setter中转换它:
或者,您可以为每个单元创建类:
它的用途就像
a6b3iqyw2#
有很多不同的方法可以实现这一点。这里是使用委托的一种方法。
你可以这样使用:
如果需要double以外的其他类型,则需要重载Convert方法。
3npbholx3#
想想你想如何使用它,并让它指导你。例如,你想表示什么样的度量单位?你的基本单位是什么?应该如何处理度量单位之间的转换?
马上,我想我们可以看到,你将需要某种方式来表示一个测量单位,例如英尺,米,升,弗隆,度,千克,磅,居里,欧姆等,这似乎是一个类,或一系列类-也许单位作为基础,与英尺,米,升,然后我想你需要一些方法来将单位和值联系起来。这个单位/值必须提供一些方法来在相同类型的度量单位之间进行转换(长度/距离、体积、温度、质量/重量),并且如果调用代码尝试可疑的东西,则足够明亮以抛出合理的异常(例如将27摄氏度转换为英里/小时)。一些方便的方法来创建单位/值示例会很方便。单位/值的东西应该不要被束缚在一个特定的种类或类别的单位,但应该高兴地能够处理任何单位,你关心扔在它。
在代码方面,我认为这样的东西会很棒:
应该可以打印出类似于
因此,您可以看到,将一个UnitValue除以另一个UnitValue应该产生一个具有复合单位的新UnitValue-在本例中,
a / b
应该产生一个单位为Feet per Seconds(英尺/秒)的UnitValue,然后转换例程As
将其转换为其他值,在本例中为miles per hour。我希望这有助于激发你的一些思考。
分享和享受。
vbopmzt14#
我只是通过使用矩阵来完成类似的事情