2010-01-30 89 views
2

我正在阅读CodeBetter.com的Business Primitives,并且正在酝酿这个想法。以他的Money为例,如何以一种与常规值类型类似的方式实现这个功能?重载“设置为等于”运算符

我的意思是这样:

Money myMoney = 100.00m; 

相反的:

Money myMoney = new Money(100.00m); 

我明白如何覆盖所有运营商允许的功能做数学等等,但我不”不知道需要重写什么以允许我正在尝试做什么。

这样做的想法是最大限度地减少实现新类型时所需的代码更改,并保持原来的类型不变,只需使用不同的值类型名称和业务逻辑功能。

理想情况下,我会继承Integer/Float/Decimal或任何必需的,并根据需要重写,但显然不适用于结构。

回答

7

更清晰,您可以提供从decimalimplicit cast operatorMoney像这样:

class Money { 
    public decimal Amount { get; set; } 
    public Money(decimal amount) { 
     Amount = amount; 
    } 
    public static implicit operator Money(decimal amount) { 
     return new Money(amount); 
    } 
} 

用法:

Money money = 100m; 
Console.WriteLine(money.Amount); 

现在,这里发生的不是我们正在重载赋值运算符;这在C#中是不可能的。相反,我们正在做的是提供一个操作员,可以在必要时隐式投射decimalMoney。在这里,我们试图将100m的十进制文字分配给Money类型的实例。然后,在幕后,编译器将调用我们定义的隐式转换运算符,并使用该转换运算符将转换结果分配给Money的实例money。如果您想了解其中的机制,请阅读C#3.0规范的第7.16.1节和第6.1节。

请注意,模型货币的类型应为decimal,如上所示。

+0

啊哈,这就是我一直在寻找! 是否有可能将其隐式转换为它所分配的类型? 我可以举例: decimal dec = myMoney; – 2010-01-30 03:50:23

+0

@Aquitarum Custos:是的,你完全可以。只要说'公共静态隐式操作符小数(金钱){return money.Amount; }'然后'小数d =金钱'是完全合法的。因此,你必须要说的魔术词是“公共静态隐式运算符”,然后你给出返回类型(所以这里是'decimal'),然后,作为运算符的单个参数,你想要转换的类型的参数所以在这里'钱')。请注意,返回类型或参数类型之一必须是封闭类的类型。因此'public static implicit operator string(int i)'是不合法的。 – jason 2010-01-30 04:02:19

+0

很高兴知道它的双向作用,谢谢! – 2010-01-30 04:23:52

0

赋值运算符不能在C#中定义,但对于这种类型的赋值,你可以重载隐式类型转换操作符:

(Money类内)

public static implicit operator Money(double value) 
{ 
    return new Money(value); 
} 

注:我推荐使用准确的货币计算小数点

+1

请不要使用双重代表金钱! – 2010-01-30 03:42:40

+0

@丹这就是为什么有一个笔记,用户使用双字面。 – 2010-01-30 03:49:57

+0

对不起,当我打字时,那个笔记不在那里。 – 2010-01-30 07:41:51