我目前正在开发一些自定义类型的 Unit
,我希望其他用户可以使用数学运算(sin、cos、ln等)。
我想要做的是重载 System.Math
中的数学函数,使其接受 Unit
类型作为参数,这样用户在编写代码时就不必使用两个不同的静态方法 (Math.Sin()
和 Unit.Sin()
) 来处理浮点数和 Unit
的计算。我希望对于想使用我的类的人来说,这将会很简单。
如何重载 System.Math
或者有没有其他方法可以实现我的目标呢?
我目前正在开发一些自定义类型的 Unit
,我希望其他用户可以使用数学运算(sin、cos、ln等)。
我想要做的是重载 System.Math
中的数学函数,使其接受 Unit
类型作为参数,这样用户在编写代码时就不必使用两个不同的静态方法 (Math.Sin()
和 Unit.Sin()
) 来处理浮点数和 Unit
的计算。我希望对于想使用我的类的人来说,这将会很简单。
如何重载 System.Math
或者有没有其他方法可以实现我的目标呢?
欢迎来到Stack Overflow,感谢你的提问。
跟大部分".Net"的东西一样,有多种实现方式。我会使用用户自定义转换运算符。
通过使用转换运算符,你的Unit
类型可以被转换为其他数据类型。
例如,如果你想使用Unit
执行Math.Sin函数,你可以创建一个显式或隐式转换运算符。
public struct Unit
{
private readonly double value;
public Unit(double value)
{
this.value = value;
}
public static implicit operator double(Unit d) => d.value;
public static explicit operator Unit(double b) => new Unit(b);
}
结果是,Math.Sin(double)
现在可以接受一个单位参数。
var unit = new Unit(1d);
var sin = Math.Sin(unit);
Console.WriteLine(sin.ToString(CultureInfo.InvariantCulture));
Unit
)以表现为原始类型,并允许与现有的数值类型之间进行隐式转换。 - JAlex
Unit.Sin()
方法是什么样子的?为什么它与Math.Sin()
方法相似到你觉得在使用它的代码中应该完全一致?如果你的Unit
类型委托给了Math
方法本身,你可以使用隐式转换。如果Unit
类型代码与Math
代码显著不同,即使可能(实际上不可能)重载Math
方法也是一个非常糟糕的想法。请澄清问题,包括提供一个 [mcve],以显示你想要做什么。 - Peter Duniho