2014-11-03 49 views
-3
static void Main(string[] args) 
{ 
    AbsValue<int> ABS = new AbsValue<int>(); 
    AbsValue<double> ABSdouble = new AbsValue<double>(); 

     ABS.X = -5; 
     ABSdouble.X = 65.3; 

    Console.WriteLine("Integer absolute value: {0}", Math.Abs(ABS.X)); 
    Console.WriteLine("Double absolute value: {0}", Math.Abs(ABSdouble.X)); 

    Console.ReadLine(); 

    } 
} 

我不認爲這是正確的,但它似乎工作。你能不能給我一些建議,我可以如何讓它變得更好?使用通用類計算數字的絕對值

class AbsValue<T> 
{ 
    public T X; 
} 
+2

不,這就是它。你認爲這種獲得絕對值的方法有什麼錯誤? – BradleyDotNET 2014-11-03 19:44:00

+0

你應該在'AbsValue'類中包含你對'Math.Abs​​'的調用。 – 2014-11-03 19:44:29

+1

@ArturoTorresSánchez如何? 'Math.Abs​​'不是通用的。 – 2014-11-03 19:46:52

回答

0

這裏沒有一個乾淨的方式來包裝Math.Abs到一個通用的功能,因爲:1 )該函數不是通用的,而是針對每種數字類型設計爲overloads,以及2)爲.NET數據類型創建通用約束不可能在.NET 中。

即使你這樣做,你仍然必須有一個巨大的switch聲明來調用正確的Math.Abs過載。

我想我會發現一個不同的問題來解決初學者 - 這不是一個簡單的學習練習。


您可以通過參數限制到struct, IComparable, IFormattable親近,但它並沒有真正給你買多少,你不得不施放使用任何運營商或框架數學函數。

+0

'string'不滿足'struct'約束。 – Servy 2014-11-03 19:55:01

+0

@Servy謝謝 - 臨時瘋狂,我在想價值型。 – 2014-11-03 20:02:57

0

如果你想要做Abs一般,你可以創建一個接口,並實現它的doubleint如:

public interface IAbsNum<T> 
{ 
    T Abs(T num); 
} 

public class IntAbsNum : IAbsNum<int> 
{ 
    public int Abs(int num) { return Math.Abs(num); } 
}