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


Полезное:

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


Категории:

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






Объектно-ориентированное программирование





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

Структурное (процедурное) программирование - построение программ, как набора взаимодействующих между собой функций.

При построении больших программных продуктов, структурная разработка имеет два важных ограничения. Во-первых, в результате этой техники получается негибкая структура. Если основной алгоритм требует изменения, оно может затронуть многие алгоритмы более низких уровней. Во-вторых, сама техника не очень подходит для повторного использования кода. Под повторным использованием кода мы подразумеваем возможность использовать части кода (либо в чистом виде, либо с небольшими изменениями) в других местах в программе или даже в совсем других программах. Редко удается повторно использовать сложную функцию C++ в другом контексте.

Другая методика, сильно упрощающая повторное использование кода, это объектно-ориентированная разработка (OOP). OOP раскладывает задачу на объекты - самостоятельные блоки, состоящие как из данных, так и из операций над этими данными. Процесс реализации объектно-ориентированной разработки называется объектно-ориентированным программированием (ООП). Его конечным результатом является набор взаимодействующих друг с другом объектов. В OOP и ООП данные играют ведущую роль; основной задачей алгоритмов является реализация операций над объектами.

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

Некоторые языки программирования были созданы специально для поддержки OOP и ООП. Это C++, Smalltalk, Simula, CLOS, Objective-C. Eiffel, Actor, Object Pascal, последние версии Turbo Pascal, и другие. Эти языки, называемые объектно-ориентированными языками программирования, имеют возможности для абстракции данных, наследования и динамического связывания.

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

Основные принципы ООП были заложены еще в середине 60-х годов в языке Simula. Однако, большинство современных терминов, связанных с ООП, пришло из Smalltalk - языка, разработанного в конце 70-х в Xerox Palo Alto Research Center. В ООП термин «объект» имеет специфическое значение: это самостоятельный элемент, содержащий данные и операции над данными. Другими словами объект представляет собой экземпляр абстрактного типа данных, то есть у объекта есть внутреннее состояние (текущие значения его закрытых данных, называемых переменными экземпляра) и набор методов (общедоступные (public) операции). Методы являются единственным средством получения или изменения состояния объекта другим объектом. Это свойство ООП называется инкапсуляция.

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

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

В C++ мы определяем свойства и поведение объектов, используя механизм классов. В программе классы могут быть связаны различными способами. Наиболее часто встречаются три вида взаимосвязи:

1. два класса являются независимыми друг от друга и не имеют ничего общего;

2. два класса связаны наследованием;

3. два класса связаны композицией.

Итак, основными свойствами ООП являются, инкапсуляция (сокрытие информации, при определении пользователем новых типов данных), наследование (механизм позволяющий строить иерархию типов) и полиморфизм (обозначения общего действия одним именем, которое используется во всей иерархии типов, причем каждым типом по-своему).

 

Наследование

В повседневной жизни часто можно расположить понятия в соответствии с иерархией наследственных связей - иерархией, в которой каждое понятие наследует свойства понятия, ближайшего сверху по иерархической лестнице. Например, можно классифицировать различные виды транспортных средств в соответствии с иерархией наследственных связей. Следуя сверху вниз по иерархической лестнице, мы видим, что каждый «нижний» вид транспортного средства является более специализированным, чем его родитель (и все его предки), и более общим, чем его наследник (и все его потомки).

Пример.

Колесное транспортное средство наследует свойства, общие для всех транспортных средств (оно должно перевозить из одного места в другое одного и более людей), но имеет дополнительное средство, которое делает его более специализированным (у него есть колеса). Автомобиль наследует свойства, общие для всех колесных транспортных средств, но также имеет свои особенные, более специальные свойства (четыре колеса, двигатель, каркас, и так далее).

Взаимоотношения наследования можно рассматривать как отношения «является экземпляром».

Пример.

Каждая машина, имеющая две двери, является экземпляром автомобиля; каждый автомобиль является экземпляром колесного транспортного средства; каждое колесное транспортное средство является экземпляром транспортного средства.

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

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

Общая форма порождения нового класса:

сlass <имя_порожденного_класса>:[вид_порождения]

<имя_базового_класса>

{Объявление член-функций}

Пример.

сlass Display: public Device {...};

Правила определения списка порождения:

1. количество базовых классов может быть любым;

2. каждый базовый класс задается в списке порождения один раз;

3. каждый базовый класс к моменту определения порожденного класса должен быть определен, либо для него должно быть задано упреждающее описание.

Обычно объявление каждого класса выносят в отдельный файл с расширением.h или.hpp, затем это объявление включают директивой препроцессора #include.

Пример.

#include <device.h>

сlass Display: public Device {...};

или, если объявление классов Device и Display задано в одном файле:

class Device; // упреждающее описание

сlass Display: public Device {...};

сlass Device {...};

Итак, каждый производный класс также является экземпляром базового класса. Обычно спецификация производного класса составляется путем добавления специфических свойств к уже унаследованным от базового класса.

Пример.

Предположим, что кто-то уже написал класс Time, имеющий следующую спецификацию:

class Time

{int hrs, mins, secs;

public:

void Set(int hours, int minutes, int seсоnds);

void Increment();

void Write() const;

Time(int initHrs, int initMins, int initSecs);

// Конструктор

Time(); // Конструктор по умолчанию,

// устанавливающий время в 0:0:0

};

Time:: Time(int initHrs, int initMins,

int initSecs)

{hrs=initHrs;

mins=initMins;

secs=initSecs;

}

Time:: Time()

{hrs=0;

mins=0;

secs=0;

}

Предположим, что нужно изменить класс Time, добавив в него в качестве закрытых данных перечисляемый тип, показывающий (американский) часовой пояс: EST - для восточного стандартного времени, CST - для центрального стандартного времени, MST - для горного стандартного времени, PST - для тихоокеанского стандартного времени, EDT - для восточного дневного времени, CDT - для центрального дневного времени, MDT - для горного дневного времени или РDТ - для тихоокеанского дневного времени.

Нужно изменить функцию Set и конструкторы класса, чтобы учесть значение часового пояса, а функция Write должна выводить время в виде 12:34:10 CST.

Функция Increment, увеличивающая значение времени на одну секунду, не требует изменения.

Чтобы добавить в класс Time свойство, касающееся часового пояса, традиционным способом является следующий: берем исходный код, находящийся в файле реализации time.cpp, анализируем детали реализации класса, затем вносим требуемые изменения и перекомпилируем исходный код.

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

В языке C++ есть намного более быстрый и безопасный способ добавить в класс свойство, отражающее часовой пояс: использование наследования. Давайте создадим, класс-наследник класса Time и затем добавим в него необходимые свойства. Этот новый, расширенный класс, - назовем его ExtTime, - наследует члены базового класса Time. Ниже приведено объявление класса ExtTime:

Пример.

enum ZoneType {EST,CST,MST, PST,EDT,CDT,MDT,PDT};

class ExtTime: public Time

{ZoneType zone;

public:

void Set(int hours, int minutes, int seconds,

ZoneType timeZone);

void Write() const;

ExtTime(int initHrs, int initMins, int initSecs,

ZoneType initZone); // Конструктор

ExtTime(); // Конструктор по умолчанию,

// устанавливающий время в 0:0:0 EST

};

Самая первая строка объявления

class ExtTime: public Time

указывает, что класс ExtTime является наследником класса Time. Зарезервированное слово public говорит, что для класса ExtTime класс Time является общедоступным базовым классом. Это означает, что все общедоступные (public) члены класса Time (за исключением конструкторов) являются общедоступными членами класса ExtTime. Другими словами, функции-члены класса Time, - Set, Increment и Write, - могут вызываться из объектов класса ExtTime. Специфические изменения базового класса вносятся в разделе public класса ExtTime при помощи повторной реализации (замещения) наследуемых функций Set и Write и написания двух новых конструкторов.

Замещение - новая реализация функции-члена, унаследованной от родительского класса.

В разделе private класса ExtTime добавляется новый закрытый член – zone,таким образом, теперь закрытыми членами класса ExtTime являются: hrs, mins, secs (унаследованные от класса Time) и zone.

Date: 2016-05-13; view: 377; Нарушение авторских прав; Помощь в написании работы --> СЮДА...



mydocx.ru - 2015-2024 year. (0.006 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию