我正在通过CodeBetter.com阅读Business Primitives并正在考虑这个想法。
以他的Money为例,如何以类似于常规值类型的方式实现它?
我的意思是这样做:
Money myMoney = 100.00m;
而不是:
Money myMoney = new Money(100.00m);
我理解如何覆盖所有运算符以允许执行数学等功能,但我不知道需要覆盖什么来允许我正在尝试做的事情。
这样做的想法是最小化实现新类型时所需的代码更改,并保持它是基本类型的相同想法,只需使用不同的值类型名称和业务逻辑功能。
理想情况下,我会继承Integer / Float / Decimal或任何需要的东西,并根据需要覆盖,但显然结构不可用。
答案 0 :(得分:7)
您可以提供从decimal
到Money
的{{3}},如下所示:
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#中是不可能的。相反,我们正在做的是提供一个可以在必要时隐式地将decimal
强制转换为Money
的运算符。在这里,我们尝试将十进制文字100m
分配给类型为Money
的实例。然后,在后台,编译器将调用我们定义的隐式强制转换运算符,并使用它将转换结果分配给money
的实例Money
。如果您想了解其机制,请阅读C#3.0规范的§7.16.1和§6.1。
请注意,如上所示,模拟金钱的类型应该是decimal
。
答案 1 :(得分:0)
答案 2 :(得分:0)
无法在C#中定义赋值运算符,但是对于这种赋值,您可以重载隐式强制转换运算符:
(在Money课程内)
public static implicit operator Money(double value)
{
return new Money(value);
}
注意:我建议使用小数进行准确的货币计算