2014-11-03 54 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); } 
}