Кент Рейсдорф. BORLAND C++BUILDER. Раздел 1
Кент Рейсдорф. BORLAND C++BUILDER. Страница 77
Чтобы понять роль уровней доступа, прежде всего нужно разобраться в том, как используются классы. Любой класс содержит открытую часть, к которой возможен доступ извне класса, и закрытую часть. Закрытая часть класса определяет его внутреннюю реализацию. В хорошо спроектированном классе от пользователя скрыто все, что ему не требуется знать.
Абстрактное представление данных (data abstraction) — это закрытие внутренней реализации свойств класса от взгляда извне.
Абстрактное представление данных дает пользователю возможность знать о классе ровно столько, сколько необходимо, и предохраняет от вмешательства туда, куда вмешиваться не следует. Например, когда вы садитесь в автомобиль и поворачиваете ключ зажигания, хотите ли вы знать все подробности работы машины? Конечно, нет. Вы хотите знать ровно столько, сколько необходимо для безопасной езды. В этой аналогии рулевое колесо, педали, рычаг переключения передач, спидометр и пр. представляют собой интерфейс между водителем и автомобилем. Водитель знает, какими из этих элементов нужно пользоваться, чтобы машина ехала туда, куда он хочет.
Продолжая аналогию, можно сказать, что двигатель, трансмиссия и электрооборудование автомобиля скрыты от взгляда извне. Двигатель будет работать даже в том случае, если вы никогда не захотите открыть капот. (Это работа для станции техобслуживания!) Его устройство — это детали, которые вам не нужно знать. Они скрыты от вас. Представьте, о каком количестве вещей придется беспокоиться, если следить за всем, что происходит в машине: правильно ли карбюратор приготовляет смесь? Достаточно ли смазки в дифференциале? Хватает ли напряжения генератора для нормальной работы зажигания и радиоприемника? В норме ли зазоры впускных клапанов? Бр-р-р-р!!! Кому это нужно? Таким же образом в классах закрыт доступ к внутренним деталям, чтобы пользователь мог не беспокоиться о том, что происходит «под капотом». Внутренняя работа класса закрыта, тогда как интерфейс пользователя является открытым.