所以我有一个值object
,(任意说钱),我想为它实现相等。我知道==
和.Equals()
的目标/默认行为(参考和数据相等)。
在这种情况下,我希望能够比较两个对象,并说它们相当于计算(例如1m和3ft相当)
但是对于持久性(使用NHibernate
,isDirty
我认为取决于平等),用户显示和选择货币,我希望它们被认为是不同的。
在这种情况下,我应该
==
和.Equals()
有不同的行为(哪些应该做什么),.IsEquivalent()
这样的方法(我不想做后者)我应该遵循最佳做法/模式吗? 感谢
编辑: 我得到了一些关于改变汇率的回应。所以要更新清晰度。让我们说高度,而不是货币
我更关注实践和模式,而不是实施货币。 基本上,相同的方法是一个人的身高,其中身高是一个价值对象,({1,m}到{3,ft},其中1m总是“等于”/“相当于”3英尺)
答案 0 :(得分:5)
我不会将1.0美元视为等于至0.63英镑。为了检查monitary值的相等性,你需要的信息不仅仅是两个值 - 你还需要当前的汇率等。尤其如此,因为相同的两个值不会一致的,如果两个值相等,则等式应该始终为真。
因此,一种方法,例如AreEquivalentMonitaryValues()
似乎是合适的 - 特别是考虑到需要额外的信息。
答案 1 :(得分:2)
由于您需要不同的相等定义,具体取决于您要使用IEqualityComparer
的上下文。
作为类型本身的Reed suggests等式应该真正意味着“永远和永远是平等的”而不是等于当前的汇率,但是拥有IEqualityComparer只意味着“从这个角度来看”比较,他们是平等的“。从那里你可以拥有ExchangeRate
类型,或者给定汇率的东西,能够创建一个IEqualityComparer<Money>
对象,代表给定汇率的等式 。然后可以使用该等式比较来比较各种类型的货币是否相等。
另一种方法完全是创建“不变货币”,并提供您的类ToInvariant
和FromInvariant
方法,以便非不变货币不等于(永远)和不变货币可以相等尽管货币产生了不变的价值。
答案 2 :(得分:0)
创建一个类MoneyExchangeRates
,其方法为IsWorthApproximatelyTheSame(Money m1, Money m2)
。
汇率随时间变化,不会使它们成为全球可变状态。