2010-04-21 61 views
1

我在數量(Fowler)類中有一個變體,該類設計用於促進單元之間的轉換。該類型被聲明爲:使用泛型進行重構練習

public class QuantityConvertibleUnits<TFactory> 
    where TFactory : ConvertableUnitFactory, new() { ... } 

爲了做到不同單位之間的數學運算,我操作的右側轉換到任何單位的左手邊是等效的數量,並做數學題在創建新數量之前的金額(這是一個雙倍)。裏面一般數量級的,我有以下幾點:

protected static TQuantity _Add<TQuantity>(TQuantity lhs, TQuantity rhs) 
     where TQuantity : QuantityConvertibleUnits<TFactory>, new() 
    { 
     var toUnit = lhs.ConvertableUnit; 
     var equivalentRhs = _Convert<TQuantity>(rhs.Quantity, toUnit); 
     var newAmount = lhs.Quantity.Amount + equivalentRhs.Quantity.Amount; 
     return _Convert<TQuantity>(new Quantity(newAmount, toUnit.Unit), toUnit); 
    } 

    protected static TQuantity _Subtract<TQuantity>(TQuantity lhs, TQuantity rhs) 
     where TQuantity : QuantityConvertibleUnits<TFactory>, new() 
    { 
     var toUnit = lhs.ConvertableUnit; 
     var equivalentRhs = _Convert<TQuantity>(rhs.Quantity, toUnit); 
     var newAmount = lhs.Quantity.Amount - equivalentRhs.Quantity.Amount; 
     return _Convert<TQuantity>(new Quantity(newAmount, toUnit.Unit), toUnit); 
    } 

    ... same for multiply and also divide 

我需要打字權的具體數量,所以附加運算的一個例子是這樣的:

 public static ImperialLengthQuantity operator +(ImperialLengthQuantity lhs, ImperialLengthQuantity rhs) { return _Add(lhs, rhs); } 

的問題是Quantity類中的詳細方法。代碼之間的唯一變化是數學運算符(+, - ,*等),所以似乎應該有一種方法將它們重構爲常用方法,但我只是沒有看到它。

我該如何重構該代碼?

乾杯,
Berryl

回答

4

你可以寫一個

protected static TQuantity _Operator<TQuantity>(TQuantity lhs, TQuantity rhs, 
             Func<double, double, double> op) 
     where TQuantity : QuantityConvertibleUnits<TFactory>, new() 
{ 
     var toUnit = lhs.ConvertableUnit; 
     var equivalentRhs = _Convert<TQuantity>(rhs.Quantity, toUnit); 
     var newAmount = op(lhs.Quantity.Amount,equivalentRhs.Quantity.Amount); 
     return _Convert<TQuantity>(new Quantity(newAmount, toUnit.Unit), toUnit); 
    } 

,並使用(d1, d2) => d1 + d2作爲附加參數調用您的_Add此功能,等等。

+0

甜蜜的解決方案。謝謝! – Berryl 2010-04-21 15:28:07

0

沒有直接通用的運營商在C#中的支持。您可以假冒在C使用dynamic .NET 4#4.0 - 即

TQuantity newAmount = (dynamic)lhs.Quantity.Amount - 
         (dynamic)equivalentRhs.Quantity.Amount; 

或者你也可以做到這一點在.net 3.5及以上使用MiscUtil提供an Operator class與實用方法(支持自定義和內置運營商):

TQuantity newAmount = Operator.Add(lhs.Quantity.Amount, 
            equivalentRhs.Quantity.Amount); 

或者,提供一個ICalculator<T>接口和每種類型的寫入實現。