Cокрытие информации (инкапсуляция) 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Cокрытие информации (инкапсуляция)



 

Как вы уже знаете, класс содержит данные и методы (функции). Для использования класса программы просто должны знать информацию, которую хранит класс (его элементы данных) и методы, которые манипулируют данными (функции). Вашим прикладным программам не требуется знать, как работают методы. Более того, программы должны знать только, какую задачу выполняют методы. Например, предположим, что у вас есть класс file. В идеале ваши программы должны знать только то, что этот класс обеспечивает методы flle.print, который печатает отформатированную копию текущего файла, или file.delete, который удаляет файл. Вашей программе не требуется знать, как эти два метода работают. Другими словами, программа должна рассматривать класс как "черный ящик". Программа знает, какие методы необходимо вызывать и какие параметры им передать при выполнении операций с объектами класса, но программа ничего не знает о реальной работе, выполняющейся внутри класса (в "черном ящике"). Сокрытие информации представляет собой процесс, в результате которого программе предоставляется только минимальная информация, необходимая для использования класса. В предыдущих программах каждый из созданных вами классов использовал метку public для объявления всех элементов класса общими, т. е. видимыми для всей программы. Таким образом, программа могла бы непосредственно обратиться к любому элементу класса, используя оператор точку:

class employee

{

public:

char name[64];

long employee_id;

float salary;

void show_employee(void);

};

employee worker, boss;

worker.salary = 25000;

 

При создании класса вы могли бы иметь элементы, чьи значения используются только внутри класса, и обращаться к которым самой программе нет необходимости. Такие элементы являются частными (private), и их следует срывать от программы. Если вы не используете метку public, то по умолчанию C++ подразумевает, что все элементы класса являются частными. Ваши прикладные программы не могут обращаться к частным элементам класса, используя оператор точку. К частным элементам класса могут обращаться только элементы самого класса. При создании класса вам следует разделить элементы на частные и общие, как показано ниже:

class some_class

{

public:                                                    // Общие элементы

int some_variable;

void initialize_private(int, float);

void show_data(void);

private:                                                  // Частные элементы

int key_value;

float key_number;

};

В данном случае программа может использовать оператор точку для обращения к общим элементам, как показано ниже:

some_class object; // Создать объект

object.some_variable = 1001;

object.initialize_private(2002, 1.2345);

objeot.show_data();

Если ваша программа попытается обратиться к частным элементам key_value или key_number, используя оператор точку, компилятор сообщит о синтаксических ошибках.

Как правило, Вы будете защищать элементы класса от прямого доступа к ним делая их частными. При этом программы не могут непосредственно присваивать значения таким элементам, используя оператор точку. Для того чтобы присвоить значение этим элементам, программа должна вызвать метод класса. Предотвращая прямой доступ к элементам данных, вы, таким образом, можете гарантировать, что им всегда будут присваиваться допустимые значения. Например, предположим, что объект nuclear_ reactor вашей программы использует переменную с именем melt_ down, которая всегда должна содержать значение в диапазоне от 1 до 5. Если элемент melt_ down является общим, программа может непосредственно обратиться к элементу, изменяя его значение произвольным образом:

nuclear_reactor.melt_down = 101;

Если вместо этого вы делаете переменную частной, то можете использовать метод класса, например assign_m eltdown, чтобы присвоить значение этой переменной. Как показано ниже, функция assign_ meltdown может проверять присваиваемое значение, чтобы убедиться, что оно является допустимым:

int nuke::assign_meltdown(int value)

{

if ((value > 0) && (value <= 5))

{

melt_down = value;

return(0); // Успешное присваивание

}

else

return(-1); // Недопустимое значение

}

Методы класса, которые управляют доступом к элементам данных, представляют собой интерфейсные функции. При создании классов Вы будете использовать интерфейсные функции для защиты данных своих классов.

Следующая программа INFOHIDE.CPP иллюстрирует использование общих и частных элементов класса. Программа определяет класс employee, как показано ниже:

class employee  

{

 public:

int assign_values (char *, long, float);

void show_employee (void);

int change_salary (float);

long get_id(void);

 private:

char name [64];

long employee_id;

float salary;

};

Как видите, класс защищает все свои элементы данных, объявляя их частными. Для доступа к элементам данных программа должна использовать интерфейсные функции. Ниже приведена реализация программы INFOHIDE.CPP:

 

//Здесь могут вводится функции и классы пользователя

//**************************************************

class employee

{

 public:

int assign_values (char  *, long, float);

void show_employee (void);

int change_salary (float);

long get_id(void);

 private:

char name [64];

long employee_id;

float salary;

};

 

int employee::assign_values(char *emp_name, long emp_id, float emp_salary)

{

strcpy(name, emp_name);

employee_id = emp_id;

if (emp_salary < 50000.0)

{

salary = emp_salary;

return(0); // успешно

}

else

return(-1); // недопустимый оклад

}

 

void employee::show_employee(void)

{

cout << RUS("Имя: ") << name << endl;

cout << RUS("Номер служащего: ") << employee_id << endl;

cout << RUS("Оклад: ") << salary << endl;

}

 

int employee::change_salary(float new_salary)

{

if (new_salary < 50000.0)

{

salary = new_salary;

return (0); // Успешно

}

else

return (-1); // Недопустимый оклад

}

long employee::get_id(void)

{

return(employee_id);

}

//Здесь введите свою программу, например:

//****************************************************

employee worker;

if (worker.assign_values("Happy Jamsa", 101, 10101.0) == 0)

{

cout << RUS("Служащему назначены следующие значения") << endl;

  worker.show_employee();

if (worker.change_salary(35000.00) == 0)

{

cout << RUS("Назначен новый оклад") << endl;

worker.show_employee();

}

else

cout << RUS("Указан недопустимый оклад") << endl;

}

//****************************************************

 

Несмотря на то, что программа достаточно длинна, ее функции на самом деле очень просты. Метод assign_values инициализирует частные данные piacca. Метод использует оператор if, чтобы убедиться, что присваивается допустимый оклад. Метод show_employee в данном случае выводит частные элементы данных. Методы change_salary и get_id представляют собой интерфейсные функции, обеспечивающие программе доступ к частным данным.

Для снижения количества возможных ошибок ограничивайте доступ программ к данным класса, определяя элементы данных класса как частные. Таким образом, программа не сможет обратиться к элементам данных класса, используя оператор точку. Вместо этого класс должен определять интерфейсные функции, с помощью которых программа может присваивать значения частным элементам. Интерфейсные функции в свою очередь, могут исследовать и скорректировать значения, которые программа пытается присвоить.

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

 

 



Поделиться:


Последнее изменение этой страницы: 2021-11-27; просмотров: 35; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.218.194.84 (0.012 с.)