private:
Balance currentBalance;
Rate currentInterestRate;
};
Поскольку вы еще не читали главу 14 "Базовые концепции классов", некоторые обозначения в этом тексте могут быть вам незнакомы. По сути, у вас есть класс с конструктором savingsAccount, который должен быть вызван для создания объекта SavingsAccount с начальной суммой, что эквивалентно открытию счета. Аналогично, имеется деструктор -SavingsAccount, вызываемый для удаления объекта (закрытия счета). Для совершения некоторых действий над счетом класс располагает функциями-членами deposit, withdraw и setinterestRate, а также другими, иногда называемыми функциями доступа. Функции доступа (Accessor functions) сообщают клиенту объекта savingsAccount значения неких конфиденциальных данных, хранимых объектом.
Рассматривая класс savingsAccount, представителем которого является объект SavingsAccount, вы описали объект с четко определенными функциями на языке вашей проблемной области — личных финансов. Практически все, что можно ожидать от сберегательного счета, у вас есть; ваша абстракция обладает всеми необходимыми характеристиками.
Однако мы ничего не знаем о функционировании класса savingsAccount. Клиенту, пользующемуся услугами объекта SavingsAccount, в действительности неважно, как он хранит историю вашего текущего баланса и совершает вклады или выплаты. И вот здесь мы подошли к следующей характеристике объекта — инкапсуляции.
Инкапсуляция
В то время как абстракция имеет дело с ролями и свойствами объекта, инкапсуляция (encapsulation) относится к реализации и структуре объекта. Вообще говоря, клиенту объекта нет дела до того, как объект работает (это может иметь значение, если его услуги слишком медленны или ошибочны);
ему важно лишь, чтобы декларируемый объектом сервис неукоснительно предоставлялся. Таким образом, конструкция объекта обычно спрятана от глаз клиента; синонимом инкапсуляции может служить более понятный термин сокрытие информации (information hiding).
Обратив еще раз внимание на класс SavingsAccount, вы можете заметить закрытый (private) параметр currentBalance (текущий баланс). Очень похоже, что класс SavingsAccount не просто помнит текущую сумму на с,чету; весьма вероятно, со счетом связано нечто вроде сберкнижки, в которой записываются все операции, совершаемые со счетом. Чтобы узнать текущий баланс, надо просто сложить по книжке все сделки и получить искомый результат. Будем считать, что у нас есть класс TransactionRegister, который умеет это делать. Посмотрим, что будет, если переделать SavingsAccount таким образом: