Вы не определили INTER_BANK_COMMISION
в Base
, так что вы должны ссылаться на него через класс был определен. Поскольку вы в Transfer
модуле, вы должны быть в состоянии использовать InterBank::INTER_BANK_COMMISSION
, и вы всегда можете полностью определить это как Transfer::InterBank::INTER_BANK_COMMISSION
.
Это, в свою очередь, вы должны более внимательно изучить ваш дизайн. Вы ссылаетесь на константу подкласса (InterBank
) в суперклассе (Base
), который излишне соединяет суперкласс с его подклассом. Подкласс должен строго быть специализацией его суперкласса, и такие модификации, как удаление подкласса, не должны требовать внесения изменений в суперкласс - в этом случае исчезнет INTER_BANK_COMMISSION
, и ничего, унаследовавшее от Base
, не сможет быть subtract_commission
.
Чистый способ избежать зависимости, чтобы оставить Base#subtract_commissions
пустым, а затем заменить его в InterBank
:
class Base
private
def subtract_commission
# No default commission
end
end
class InterBank < Base
INTER_BANK_COMMISSION = 5.00
private
def subtract_commission
sender_account.commission INTER_BANK_COMMISSION
end
end
Таким образом, Base
ничего не знает о InterBank
и не имеет никаких комиссий и InterBank
самостоятельно вычитает комиссию, особенно необходимо для его типа передачи.
Комиссия вычитание поведение выглядит как он будет разделяться многими подклассами Base
, так что вы можете поднять, что резервное копирование и оставить подклассы нуждаясь только декларировать свои комиссии:
class Base
private
def commission
0
end
def subtract_commission
sender_account.commission commission
end
end
class InterBank < Base
INTER_BANK_COMMISSION = 5.00
private
def commission
INTER_BANK_COMMISSION
end
end
Теперь вы не необходимо переопределить вычитание в каждом подклассе, каждый из которых объявляет только сумму комиссионных за его тип трансферных сборов. Новые подклассы легко определить и правильно независимы друг от друга.
Вы можете даже ссылаться на константу каждого класса напрямую, если хотите, без необходимости в методе commission
.
class Base
COMMISSION = 0.00
private
def subtract_commission
sender_account.commission self.class::COMMISSION
end
end
class InterBank
COMMISSION = 5.00
end
self.class
решает Base
или InterBank
, а затем каждый определяет свою собственную COMMISSION
. Это хорошо, потому что теперь вы можете ссылаться на любую комиссию так же, как и на <class>::COMMISSION
, вместо того, чтобы иметь избыточные имена InterBank::INTER_BANK_COMMISSION
.
какой шаблон вы в конечном итоге используете? –