我正在帮朋友在Smalltalk中设计一个程序(以前从未用Smalltalk编写,我只知道c ++),我需要从txt文件中读取事务并实现它。在某些情况下,我们可能会遇到不同的货币。在这种情况下,我需要从具有日期| currency1-currency2 | currency2-currency1汇率的表中获取货币汇率。所以我模仿了我的课程:
在增加或减少时,可能会有不同的货币,比如加元,美元。因此,如果当前账户有美元,我可能需要使用运算符重载从加元转换为美元。
所以,我有一个基类货币,派生类加元和&美元。我的操作员超载似乎是这样。
Currency& operator+(Currency& c) {
local_var + c.to_canadian_dollar();
}
uint32 to_canadian_dollor() {
return local_var * er.conversion_rate(); **<-- I need to pass date for the exchange rate function to get the exchange rate for today's date.**
}
问题是我需要传递转换率的日期,但我无法通过运算符重载传递日期。
还有其他人有更好的设计吗?或者小谈话中的任何语言特征都可以让我通过日期而不会破坏链条?通过在交易之前设置日期,我可以使设计看起来很丑陋。但只是好奇,如果有更好的设计,我可以学习。
答案 0 :(得分:4)
Smalltalk没有运营商重载。因为它没有运营商。在C ++中,您将运算符和方法视为不同的,但有点类似的实体。在Smalltalk中,你只需要方法。期。因此,当您在Smalltalk代码中看到“+”时,它不是运算符(因为它们不存在于Smalltalk中)。这是一条消息发送。左侧对象充当接收器,并以右侧对象作为唯一参数向其发送“+”方法。
所以你可以做的,就是定义一个新的数字对象,它将日期动态数据封装在其中。
您没有说明您正在使用哪种Smalltalk,但大多数口味都使用double dispatch
模式来启用“数学感知”对象之间的超越数学运算。如果您提供有关问题的更多详细信息,我可以通过此处的示例提供更多详细信息......