2012-01-17 93 views
2

我在想我想做什么是不可能的,但我想我会问无论如何。我正在考虑在不同的度量标准之间实现某种自定义转换 - 例如将英寸转换为米和其他单位。类型参数约束 - 没有泛型(或最近的报价!)

我在想如下的基类叫Unit。注:我没有把任何领域举行一些单位,例如2米,5英寸等:单位为米和英制

public abstract class Unit { 
    protected string _name; 
    public Unit(string name) 
    { 
     _name = name; 
    } 
} 

然后子类:

public class Metre : Unit { 
    public Metre() : base("Metre") 
    { 
    } 
} 

public class Inch : Unit { 
    public Metre() : base("Inch") 
    { 
    } 
} 

我会喜欢有一个可以处理这些单位相互转换的类。例如:

public static class UnitConvertor 
{ 
    public Unit Convert(Unit from, Type to) : where Type extends/inherits from Unit 
    { 
     // do the conversion 
     return the instance of Type to; 
    } 
} 

有什么想法?

+3

为什么没有仿制药? – Oded 2012-01-17 22:11:56

+4

'Convert (T from,T to)where T:Unit' would be be suitable solution。 – vcsjones 2012-01-17 22:14:16

+0

vcsjones - 你的意思是转换(EngineeringUnit from,T to)where T:Unit?您需要传递T的一个实例 - 即新的Meter作为第二个参数 - 理想情况下,您不希望调用方实例化返回类型。你只想说,这是一个英寸的例子,给我米的等值。 – Andez 2012-01-17 22:30:43

回答

5

如果单位都提前知道的,你可以使用一个implicit conversion operator

public class Metre : Unit 
{ 
    public Metre() : base("Metre") 
    { 
    } 

    public static implicit operator Inch(Metre m) 
    { 
     return new Inch(39.37 * m.Value); 
    } 
} 
+0

是的,但是如果你有N个单位,你必须写N * N个转换...... – 2012-01-17 22:16:39

+0

是的 - 如果你想添加一个新的单位,你必须更新单个类,而不是说它很漂亮;-) – BrokenGlass 2012-01-17 22:18:04

+0

是的,会有很多单位。我把2作为讨论的例子,但有点像这个例子。 – Andez 2012-01-17 22:23:22