![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Инкапсуляция
Инкапсуляция – это принцип ООП, объединяющий в одном классе данные и методы, манипулирующие этими данными и защищающие данные класса от внешнего воздействия. Обратимся к примеру из жизни, чтобы понять смысл этого принципа. Представьте себе, что в вашу квартиру пришел знакомый и переставил вашу мебель по своему усмотрению, не считаясь с вашим вкусом. Скорее всего, вам это не понравится, и вы перестанете приглашать этого человека в свой дом. Если же вы для перестановки мебели позовете помощников, то сначала объясните им, что и как надо переставить, тогда в результат их работы вы получите квартиру, обустроенную так, как это нужно вам. Класс также защищает свое состояние (значения свойств) от несанкционированного изменения, это реализуется с помощью раздела класса private. Включенные в private свойства доступны только этому объекту, поэтому не могут быть изменены другими объектами. Для доступа к свойствам в раздел класса public включаются методы. Методы проверяют, возможно ли такое изменение состояния объекта под влиянием других объектов, и только после этого изменяют значения переменных состояния. Если переход в новое состояние невозможен, методы оставляют объект в прежнем состоянии. Изменим пример с принтером. Предположим, во время профилактики вычислительной системы у принтера было отключено электропитание. Естественно, в этом случае наши попытки что-то напечатать ни к чему не приведут. Учтем это в нашей модели принтера. Добавим свойство is_on, отражающее подключение к принтеру электрического питания (0 – включено, 1 – выключено). Тогда состояние принтера определяется комбинацией значений двух свойств – is_on и status(табл. 17.1). Таблица 17.1 Допустимые состояния принтера
При этом класс представляется в виде: class Printer { char model[15]; int year; int status; int is_on; //Принтер включен (0 – нет, 1 – да) public: Printer(char* _model, int _year); void on_off(); //Включение/выключение питания void set_print(); void stop_print(); void show(); }; //Конструктор Printer:: Printer(char* _model, int _year) { strcpy(model, _model); year=_year; status=0; is_on=0; //Принтер отключен по умолчанию } void Printer:: on_off() { //Метод моделирует нажатие кнопки включения //питания: если оно выключено, то произойдет //включение, и наоборот; //одновременно при любых переключениях питания //принтер оказывается в состоянии готовности //и печать не ведет is_on=! is_on; status=0; }
void Printer:: set_print() { If (is_on) status=1; //Принтер будет печатать, //если он включен }
void Printer:: stop_print() { If (status) status=0; //Принтер остановится, //если он до того печатал }
void Printer:: show() { cout < < " Модель: " < < model < < " Год выпуска: " < < year < < endl; if (is_on) { cout < < " Принтер включен"; if (status) cout < < " Состояние: печатает"; else cout < < " Состояние: готов к работе"; } else cout < < " Принтер выключен"; cout < < endl; } Класс запрещает прямой доступ к своим переменным состояния, поэтому не удастся реализовать недопустимое состояние is_on=0, status=1. Методы set_print(), stop_print(), on_off(), предоставляющие доступ к свойствам объекта, реализованы так, что также исключают это состояние объекта. В этом и заключается смысл понятия инкапсуляции. К началу главы
|