我正在爲我的學期項目開發單位轉換器。我需要一些關於類/接口/抽象類結構的幫助。我想要一些可以被類繼承的接口或抽象類(DegreesConverter,MassConverter,LenghtConverter)。喜歡也許interface IUnitConvert<Type>
。我將面向初學者處理角度(度,弧度,格拉迪),力(牛頓,帕斯卡)和數據(字節,千字節,兆字節,千兆字節,千兆字節)的單位。有什麼建議麼?單位轉換器程序
單位轉換器程序
回答
首先想到的是像System.TimeSpan這樣的類,它表示時間,你可以通過屬性以不同的單位訪問它。
你會在內部存儲的值在一些固定的單位(大概SI),並將其轉換的屬性的getter/setter方法:
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
我會使用相同的Distance.Convert方法嗎? – 2010-01-07 22:52:35
是的,對於距離(米,英尺等)的任何兩種實現都是相同的,您將它傳遞給它。 – 2010-01-08 02:13:54
有很多不同的方法可以解決這個問題。這是使用代表的一種方法。
public class Converter
{
public static double Convert(double original, Func<double, double> conversion)
{
return conversion(original);
}
}
public class SizeConverter
{
public static double MegabytesToBytes(double megabytes)
{
return megabytes * 1048576;
}
public static double KilobytesToBytes(double kilobytes)
{
return kilobytes * 1024;
}
}
你會使用這樣的:
double result1 = Converter.Convert(2, SizeConverter.MegabytesToBytes);
double result2 = Converter.Convert(2, SizeConverter.KilobytesToBytes);
如果你需要比其他雙打其它類型的,你需要重載轉換方法。
想想你會如何使用它,並讓它指導你。例如,你想表示什麼樣的單位?你的基地單位將會是什麼?如何處理度量單位之間的轉換?
對我想我們可以看到你需要一些方法來表示一個度量單位,例如,英尺,米,升,furlongs,度,千克,磅,curies,歐姆等。這似乎是一個階級,或一系列的類 - 也許單位作爲基地,腳,米,升,弗朗斯作爲子類。那麼我認爲你需要一些方法將單位與價值聯繫起來。這個單位/值必須提供某種方式來在相同類型的度量單位(長度/距離,體積,溫度,質量/重量)之間進行轉換,並且足夠亮以便在調用代碼嘗試某些可疑事件時拋出合理的異常如將27攝氏度轉換爲英里/小時)。創建單位/值實例的一些便利方法將很方便。單位/價值的東西不應該與特定種類或單位類別綁定,但應該能夠愉快地處理任何你關心的單位。
Codewise我倒是覺得這樣的事情將是巨大的:
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應該產生一個新的具有複合單位的單位值 - 在這種情況下,a/b
應該產生單位爲英尺/秒(英尺/秒)的UnitValue,其中轉換例程As
然後轉換爲其他值,在這種情況下爲每小時英里數。
我希望這有助於激發你的想法。
分享和享受。
- 1. 單位轉換器Android
- 2. 的Javascript單位轉換器
- 3. 單位轉換器PHP
- 4. 單位轉換器C#
- 5. Java單位轉換器GUI應用程序
- 6. 需要單位轉換器的程序邏輯
- 7. sympy單位轉換
- 8. 轉換單位,Java
- 9. CGContextRef單位轉換
- 10. 桌面應用程序轉換器win32應用程序轉換
- 11. 選擇器視圖 - 單位轉換
- 12. VBA位轉換器
- 13. Android轉換器,每轉換類型超過2個單位
- 14. 程序將時間以秒爲單位轉換爲hh:mm:ss格式
- 15. 單位轉換應用程序需要的數組幫助
- 16. 簡單的JavaScript單位轉換器和計算器
- 17. 如何將此程序轉換爲64位機器?
- 18. 標準單位轉換表
- 19. 測量單位轉換
- 20. 分析轉換單位
- 21. /proc/net/dev單位轉換
- 22. 單位轉換方法
- 23. 實現單位轉換
- 24. 單位轉換與巴什
- 25. 簡單的32位到64位轉換?
- 26. 溫度程序的簡單轉換
- 27. 簡單的wav 16位/ 8位轉換器源代碼?
- 28. 8位轉換器-VHDL
- 29. 將單線程應用程序轉換爲ASyncTask應用程序
- 30. 巴什 - 轉換單位名單
到目前爲止你有什麼? – John 2010-01-06 22:39:09
對不起,只是用戶界面。 – 2010-01-06 22:46:54