我目前正在實現一個簡單版本的算法差異,並在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