我目前正在实现一个简单版本的算法差异,并在C#中使用运算符重载。我试图弄清楚如何设计适用于普通双打的通用数学函数,以及像“double”一样工作的自己的类“ADouble”,但重载了算术运算符(如+,*,等等)。通用方法:返回double或double-like类
举例来说,我想创建一个函数像
Public T MathFunction<T>(T x) where T : "is either double or Adouble"
{
if (x > 0)
return new T(1.0)
else
// something
}
,无论对于双打和ADoubles工作。在这种情况下,我需要“新增”一个特定的值(这里是1.0)。在其他情况下,我可能会做这样的事情
Public T MathFunction<T>(T x) where T : "is either double or Adouble"
{
T temporaryVar = 2*x;
// .. More calculations
return "some T";
}
我已经实现必要的接口做像上面的比较,但我不能让剩下的工作。
我可以实例我ADouble类具有双重的,说
Adouble myADouble = new ADouble(12.3);
但双打不具有这样工作构造,效果显着。我尝试过不同的事情。首先,我认为像
if (typeof(T) == typeof(ADouble)
return new ADouble(1.0)
但这不起作用,因为该功能可以不投ADouble至T明确(据我所知)。
有没有人有一个关于如何去实现通用计算函数,我的ADouble类和双打的建议?或者是用不同签名制作多种方法的唯一选择?不同的设计建议也非常感谢。
AFAIK你不能用'x或y'在泛型约束。你可以用'dynamic'参数创建一个方法,如果它是'double'或者'ADouble',并且不抛出无效参数异常,就可以在里面进行测试。 –
您可以利用'Double'类实现的接口,如'IConvertible','IComparable'或'IEquatable'。 – Romoku
另一种方法是构建[Expressions](https://msdn.microsoft.com/en-us/library/system.linq.expressions.expression.aspx)。 – Romoku