2010-04-21 119 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>接口和每种类型的写入实现。