Я помогаю другу разработать программу на Smalltalk (никогда ранее не кодировался на Smalltalk, я знаю только c ++), где мне нужно читать транзакции из txt-файла и реализовывать его. Могут быть случаи, когда мы можем столкнуться с разными валютами. В этом случае мне нужно взять курс обмена валют из таблицы с обменным курсом дата | currency1-currency2 | currency2-currency1. Поэтому я смоделировал свой класс следующим образом:
При добавлении или вычитании могут быть разные валюты, например, канадский доллар, доллар. Следовательно, если на текущем счету есть доллар, мне может потребоваться пересчет в канадский доллар с использованием перегрузки операторов.
Итак, у меня есть базовый класс Currency, производный класс Canadian Dollar & доллар. мой оператор по загрузке выглядит так.
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.**
}
Проблема в том, что мне нужно передать дату для коэффициента конверсии, но я не могу передать дату из-за перегрузки оператора.
У кого-нибудь еще есть лучший дизайн? или какая-нибудь языковая функция в светской беседе, которая позволит мне пройти свидание, не разрывая цепочку? Я могу сделать дизайн уродливым, установив дату до транзакции. Но просто любопытно, есть ли лучший дизайн, который я мог бы изучить.
Smalltalk не перегружен оператором. Потому что у него нет операторов. В C ++ у вас есть операторы и методы как отдельные, но довольно похожие сущности. В Smalltalk у вас просто есть методы. Период. Поэтому, когда вы видите «+» в коде Smalltalk, это не оператор (потому что они не существуют в Smalltalk). Это сообщение отправлено. Левый боковой объект действует как получатель, и ему отправляется метод «+» с правым боковым объектом в качестве единственного аргумента.
Так что ты мог do, будет определять новый числовой объект, который инкапсулирует ваши динамические данные даты в нем.
Вы не говорите, какой Smalltalk вы используете, но большинство вкусов используют double dispatch
шаблон, позволяющий использовать трансцендентную математику между объектами, осведомленными о математике. Если вы предоставите более подробную информацию о вашей проблеме, может быть, я приведу более подробную информацию на примере здесь …
Других решений пока нет …