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


Полезное:

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


Категории:

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






Инкапсуляция, наследование, полиморфизм





Любой язык объектно-ориентированного программирования характеризуется следующими тремя основными свойствами.

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

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

Если непосредственный родитель единственный, то наследование называется простым, а если таких классов несколько - то множественным (рис. 10). При этом класс или классы-родители и класс-потомок образуют иерархию «общее-частное».

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

Рис. 10. Иерархии классов при различных видах наследования

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

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

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

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

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

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

Сложный полиморфизм или создание полиморфных объектов. Для расширения возможностей языка в Borland Pascal и C++ указателю на объект класса-родителя разрешено присваивать адрес объекта класса-потомка. Адресуемые через указатели объекты, которым в процессе выполнения программы может быть присвоено значение, тип которого отличается от типа переменной, были названы полиморфными. В рассматриваемых языках программирования подобная ситуация возникает:

• при передаче объекта класса-потомка в качестве фактического параметра подпрограмме, в которой этот параметр описан как параметр-переменная типа класса-родителя (явно - в списке параметров или неявно - в качестве внутреннего параметра self или this, используемых при вызове методов);

• при работе с динамическими объектами, когда указателю на объект класса-родителя присваивается адрес объекта класса-потомка.

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

Методы, для которых должно реализовываться позднее связывание, получили название динамических полиморфных или виртуальных. Для их описания в рассматриваемых далее языках программирования используется служебное слово virtual.

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

Рис. 11. Реализация механизма позднего связывания

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

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



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