C# 使用泛型进行重构练习
我有一个Quantity(Fowler)类的变体,该类旨在促进单位之间的转换。类型声明为:C# 使用泛型进行重构练习,c#,generics,refactoring,C#,Generics,Refactoring,我有一个Quantity(Fowler)类的变体,该类旨在促进单位之间的转换。类型声明为: public class QuantityConvertibleUnits<TFactory> where TFactory : ConvertableUnitFactory, new() { ... } 问题是Quantity类中那些冗长的方法。代码之间唯一的变化是数学运算符(+、-、*,等等),因此似乎应该有一种方法将它们重构为一个通用方法,但我没有看到它 我如何重构代码 干杯
public class QuantityConvertibleUnits<TFactory>
where TFactory : ConvertableUnitFactory, new() { ... }
问题是Quantity类中那些冗长的方法。代码之间唯一的变化是数学运算符(+、-、*,等等),因此似乎应该有一种方法将它们重构为一个通用方法,但我没有看到它
我如何重构代码
干杯,Berryl在C#中没有直接的通用运算符支持。您可以在.NET4上的C#4.0中使用
dynamic
-即
TQuantity newAmount = (dynamic)lhs.Quantity.Amount -
(dynamic)equivalentRhs.Quantity.Amount;
或者,您可以在.NET 3.5及更高版本中使用提供了实用程序方法(支持自定义和内置运算符)的:
或者;提供ICalculator
接口并按类型编写实现。C#中没有直接的通用运算符支持。您可以在.NET4上的C#4.0中使用dynamic
-即
TQuantity newAmount = (dynamic)lhs.Quantity.Amount -
(dynamic)equivalentRhs.Quantity.Amount;
或者,您可以在.NET 3.5及更高版本中使用提供了实用程序方法(支持自定义和内置运算符)的:
或者;提供一个ICalculator
接口,并按类型编写实现。您可以编写一个
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);
}
受保护的静态TQuantity\u运算符(TQuantity lhs、TQuantity rhs、,
(法新社)
其中TQuantity:QuantityConvertibleUnits,new()
{
var toUnit=lhs.可转换单元;
var当量=换算(rhs.数量,单位);
var newAmount=op(lhs.Quantity.Amount,equivalentRhs.Quantity.Amount);
返回-转换(新数量(新金额、单位)、单位);
}
并在\u Add
等中调用此函数。使用(d1,d2)=>d1+d2
作为附加参数。您可以编写
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);
}
受保护的静态TQuantity\u运算符(TQuantity lhs、TQuantity rhs、,
(法新社)
其中TQuantity:QuantityConvertibleUnits,new()
{
var toUnit=lhs.可转换单元;
var当量=换算(rhs.数量,单位);
var newAmount=op(lhs.Quantity.Amount,equivalentRhs.Quantity.Amount);
返回-转换(新数量(新金额、单位)、单位);
}
并使用(d1,d2)=>d1+d2
作为附加参数,在您的\u Add
中调用此函数
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);
}