Я собираюсь сделать ответ, вдохновленный частями других ответов:)
Я бы оставил Debit()
и Credit()
в качестве методов на Account
вместо того, чтобы скрывать их внутри метода черного ящика Process()
, поскольку в реальной жизни Accounts
можно списывать и кредитовать, так что это кажется более подходящая модель для меня. Я бы предложил один из двух способов включить метод CalculateInterest()
.
Первый вариант : Как указано @Dave Newton, определите интерфейс IInterestBearingAccount
, в котором есть метод CalculateInterest()
, а затем реализуйте его в SavingsAccount
. Ваш цикл в main может затем сказать:
var interestBearingAccount = account as IInterestBearingAccount;
if (interestBearingAccount != null)
{
interestBearingAccount.CalculateInterest();
}
Это дает вам то, что вы хотите, без знания того, что SavingsAccounts
начисляет проценты, в то время как другие Accounts
не относятся к методу Main
, где он не принадлежит.
Второй вариант - по касательной из ответа @Dave Newton - иметь пустой virtual
метод на Account
с именем CalculateSupplementals
(или что-то в этом роде) и Main
вызывать его , SavingsAccount
может реализовать его для расчета процентов, а CheckingAccount
ничего не может сделать. Метод базового класса имеет общее имя, так что реализующие классы могут использовать его как ловушку для выполнения дополнительных вычислений, если это необходимо для типа учетной записи, которую они представляют; он не помещает информацию о деталях производного класса в базовый класс и предоставляет где-то для других классов работу, специфичную для них.
Мои личные предпочтения, вероятно, являются первым вариантом, поскольку они ничего не добавляют в иерархию только для удовлетворения потребностей производного класса.