Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Инкапсуляция






Инкапсуляция – это принцип ООП, объединяющий в одном классе данные и методы, манипулирующие этими данными и защищающие данные класса от внешнего воздействия.

Обратимся к примеру из жизни, чтобы понять смысл этого принципа. Представьте себе, что в вашу квартиру пришел знакомый и переставил вашу мебель по своему усмотрению, не считаясь с вашим вкусом. Скорее всего, вам это не понравится, и вы перестанете приглашать этого человека в свой дом. Если же вы для перестановки мебели позовете помощников, то сначала объясните им, что и как надо переставить, тогда в результат их работы вы получите квартиру, обустроенную так, как это нужно вам.

Класс также защищает свое состояние (значения свойств) от несанкционированного изменения, это реализуется с помощью раздела класса private. Включенные в private свойства доступны только этому объекту, поэтому не могут быть изменены другими объектами. Для доступа к свойствам в раздел класса public включаются методы. Методы проверяют, возможно ли такое изменение состояния объекта под влиянием других объектов, и только после этого изменяют значения переменных состояния. Если переход в новое состояние невозможен, методы оставляют объект в прежнем состоянии.

Изменим пример с принтером. Предположим, во время профилактики вычислительной системы у принтера было отключено электропитание. Естественно, в этом случае наши попытки что-то напечатать ни к чему не приведут. Учтем это в нашей модели принтера. Добавим свойство is_on, отражающее подключение к принтеру электрического питания (0 – включено, 1 – выключено). Тогда состояние принтера определяется комбинацией значений двух свойств – is_on и status(табл. 17.1).

Таблица 17.1

Допустимые состояния принтера

is_on status Сообщение на экране
    Принтер включен
    Принтер включен Состояние: готов к работе
    Принтер включен Состояние: печатает

При этом класс представляется в виде:

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(), предоставляющие доступ к свойствам объекта, реализованы так, что также исключают это состояние объекта. В этом и заключается смысл понятия инкапсуляции.

К началу главы






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.