我正在幫助我的朋友開發單位轉換器。他問我是否可以幫忙分工。所以我正在製作一個名爲Unit的.dll。單位應該處理轉換。我正在集思廣益如何做到這一點,我想出了一個想法,把每個部分都列舉一個枚舉(比如枚舉Angle [Degrees,Radians,Gradians],枚舉Area [平方米,平方英里,...],enum Energy [牛頓,帕斯卡,焦耳,...],...)。然後,主抽象類股與所有的轉換方法
注:
我不要求你編寫的.dll文件,我只是希望你對如何意見,使該.dll。幫助抽象類/類/接口結構單元
回答
當你有這樣的多對多關係時(每個值都希望能夠被轉換成同類中的其他類型的值)時,需要注意的一點是,最終你會寫一噸如果您使用強制方法爲每種可能性編寫轉換函數,都可以使用這些方法。
如果您需要儘可能快地工作並希望確保您的錯誤得到控制,但這樣做可行,但代碼可維護性受損。
我過去在許多單元之間進行轉換時所做的一些事情是建立一個「基本」單元,所有單元都可以轉換並編寫函數以轉換爲/從該單元轉換。這讓你定義一個接口是這樣的:
interface IUnitConverter<T, U> {
T ToBaseUnit();
void FromBaseUnit(T BaseValue);
U MyValue {get;}
}
,並專注,對於某些類型的轉換:
class RadiansConverter : IUnitConverter<DegreesConverter, float> {
float radians = 0;
DegreesConverter ToBaseUnit() {...}
void FromBaseUnit(DegreesConverter BaseValue) {...}
float MyValue {get {return radians;}}
}
編輯:用法:
// assume we have a constructor that sets the private value
float degrees = new RadiansConverter(Math.PI).ToBaseUnit().MyValue;
float radians = new RadiansConverter().FromBaseUnit(degrees).MyValue;
這可能有點重量級和你必須注意錯誤的傳播打擊你兩次轉換,而不是一次。當我需要進行復雜的需要狀態存儲的GIS轉換時,它已經派上用場了,但它可能不是您正在尋找的內容。
爲什麼一個.dll?
- 你有ň套敞篷單位:角度,能源,面積,溫度,等等。
- 在每個集合中,您都有x可能的單位:角度內的度數,弧度和梯度。
在這一集的X單位,你(如果我記得我的數學右)X!可能的轉換,這在x = 3時不成問題,但對於區域有點困難,您可以在其中有平方毫米,釐米,米,英寸,英尺,碼,鏈,弗朗或英里,作爲公頃和英畝,這不需要去維基百科查看任何更隱晦的東西。 11!可能的轉換不足4000萬。
我會試圖對每個n套可轉換單元和每個單元內的一個.dll(或更具體地說一個類,並且可能將所有類放在相同的.dll中)。dll將所有內容都通過一個標準單元進行轉換,這樣您就可以在每次轉換時運行一個或兩個轉換計算(例如,將所有輸入轉換爲平方米然後再次轉出),而不是編碼每個可能的組合。二十個轉換聽起來像是一個比四千萬更快的開發任務:-)
我肯定會建議枚舉而不是自由字符串文字的單位描述,因爲這將使類更容易爲您的朋友使用,和整齊地公開可用轉換的選項。
我想不出一個很好的方式讓所有的類都實現相同的接口,因爲每次轉換都需要枚舉類型的兩個參數(from和to),並且每個類的枚舉類型都會不同。泛型可能會提供一個更清晰的解決方案,但我現在看不到 - 其他人在我輸入的時候已經回答了,但我還沒有讀到答案。
我寧願像一個設計:
var measure = Angle.FromDegrees(10);
Console.Write(measure.ToRadians());
只需從編碼可用性的角度來看我沒有看到任何安慰添加枚舉。
這將是相似的,例如,如何在框架中實現TimeSpan。
現在你提到它,我也更喜歡它。這會教會我雙腳跳躍時,我應該睡覺,而不是! – Xav 2009-12-22 12:05:25
- 1. 抽象類 - 語法幫助
- 2. 類層次結構設計 - 接口+基類與抽象類
- 3. 的Java:需要幫助構建一個類層次結構含有正常的和抽象類和接口
- 4. 抽象類,類,接口
- 5. 有關接口和抽象類的幫助
- 6. 需要幫助瞭解實現接口的抽象類
- 7. 抽象類,構造函數和接口
- 8. 抽象類返回接口
- 9. 與接口和抽象類
- 10. PHP抽象類和接口
- 11. 與抽象類的接口
- 12. 抽象類實現接口
- 13. 接口中的抽象類?
- 14. 抽象類V/s接口
- 15. 抽象類或SoftDelete接口
- 16. C#接口和抽象類
- 17. 抽象類MouseAdapter與接口
- 18. 抽象類和接口
- 19. 接口vs 100%抽象類
- 20. 接口與抽象類
- 21. 100%抽象類與接口
- 22. 純抽象類和接口
- 23. 抽象基礎或幫助類
- 24. c#接口,抽象類,強制繼承類不抽象類
- 25. 空接口和抽象類實施結構
- 26. 引用抽象類類型的結構
- 27. 單元測試抽象類和或接口
- 28. 有人可以幫助解釋抽象類和接口給我(新手)?
- 29. 單元測試類繼承抽象類
- 30. 將簡單數據類定義爲抽象,接口或類?
我一直在致力於開發一個可擴展庫來處理數量的開源項目。它不是完整的,我已經有幾種方法可以使用泛型來簡化操作,但我已經仔細考慮瞭如何將我的類設置爲可擴展且易於使用,同時堅持使用.NET標準。它在某些生產守則中已經以有限的能力使用。你可以在github上查看它:http://github.com/togakangaroo/GIM.Quantities – 2009-12-21 23:25:26