Реализация полиморфизма. Полиморфные функции и методы. Инкапсуляция, Наследование, Полиморфизм (Основы PHP - Урок из курса) Полиморфизм программирование c

Программирование - это процесс разработки решений «живых», динамичных задач в виде жёстких конструкций кода, данных, функций и алгоритмов. Процедура формирования строгого синтаксиса из неопределенной семантики. Реальные задачи - известная большая проблема алгоритмизации: чтобы достигнуть нужного решения, задачу нужно поместить в точные синтаксические конструкции.

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

Уровень и квалификация

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

Объективно также и то, что разработчик не настаивает, а заказчик не требует реального решения реальных задач. Обе стороны привыкли ограничиваться доступными инструментами и привычными возможностями.

Формы полиморфизма ООП, идеи инкапсуляции кода и наследование свойств (методов) лежат в сфере программирования, но никак не в сфере решаемой задачи.

Показательный пример - библиотека PHPOffice/PHPWord. Для её использования нужна квалификация разработчика, нужно создавать собственную систему объектов, но текущий уровень заказчика (требования заказчика) - это тривиальная композиция, которую программист перекрывает своей разработкой (иначе требования не удовлетворить). Ситуация вроде такой:

В данном случае применение библиотеки - задача форматирования документов, например, диплом или диссертация должны быть оформлены по стандарту. Заказчик предъявил свои требования, а программист пошел своим путем гораздо дальше.

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

Полиморфизм и ООП

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

  • инкапсуляция;
  • полиморфизм;
  • наследование.

Некоторые добавляют ещё: абстракция, и чаще всего именно этот, причем действительно основной момент, используют как фундамент для описания сущности ООП.

Итак, мнения об ООП полиморфны: описывают одно, сконструированы по-разному, или, наоборот, описывают разное, но базируются на четырех одинаковых позициях.

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

Популярные определения полиморфизма

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

  1. Полиморфизм в программировании - это способность предоставлять один и тот же интерфейс для различных базовых форм (типов данных).
  2. Полиморфизм - возможность объектов иметь различную реализацию.
  3. Полиморфизмом называется способность функции...
  4. Классика (от создателя С/С++): «один интерфейс - много реализаций».
  5. Параметрический полиморфизм подразумевает...
  6. Полиморфизм - положение теории типов...
  7. Абстракция невозможна без инкапсуляции и наследования, как невозможен полиморфизм без наследования...

Можно согласиться, что всё это относится к одному и тому же: но форма выражения мысли, сущность и содержание - не подобны. Но что-то общее всё же есть.

Сущность: разработчик - заказчик

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

Такой круговорот процесса решения задачи наводит на мысль, что здесь явно совмещены две совершенно разные сущности:

  • компьютер не может сам решить задачу;
  • нужна программа, чтобы компьютер мог «понять» и «решить» задачу.

Задача - сфера компетенции заказчика, программа - это алгоритм «адаптации» задачи к возможностям компьютера - сфера компетенции программиста. Роль последнего заключается в «адаптации» компьютера к требованиям задачи, а это лишнее!

Предлагает абстрагироваться . Есть объекты - это сфера заказчика; есть реализация объектов - это сфера программиста. Никакой «технологической» связи между заказчиком и разработчиком. Идея кардинальная, не реализованная по сей день, но что-то уже стабильно работает.

Окна, кнопки и другие объекты

История the Air Art Technology, Object Magazine, Turbo Vision, Graph Vision - это уже история. Мало кто помнит эти реализации ООП, они практически не используются и забыты, но оконный интерфейс Windows знаком миллионам пользователей, а объекты в средах PHP, JavaScript и других языках интернет-технологий применяются сотнями тысяч разработчиков кода, о них знают миллионы посетителей веб-ресурсов.

Вероятно, это единственно правильный путь, по которому должно было развиваться ООП: инкапсуляция, наследование, полиморфизм для разработчика, но не для пользователя. Характерно, что именно эта позиция была основной при разработке визуального оформления (интерфейса) программного обеспечения Windows, прикладных программ типа Turbo Vision и Graph Vision.

Концепция, положенная в основу продуктов типа the Air Art Technology и Object Magazine, существенно отличалась. Здесь абстрактный объект был самым первым предком информационной структуры, инкапсулировал на абстрактном уровне код обработки информации. Объекты окон, кнопок, элементов визуального оформления здесь были вторичны.

В первом варианте (Windows & etc.) парадигма ООП: инкапсуляция, наследование, полиморфизм обозначалась на уровне абстрактного предка, а реализация кода формировалась на уровне каждого конкретного потомка по ветке наследования согласно нужным структуре и содержанию.

Во втором варианте (the Air Art Technology и Object Magazine) важен уровень абстрактного объекта. Что будет у конкретного потомка - не суть, главное, чтобы его ветка наследования удовлетворяла требованиям всех родителей вниз до корневой абстракции.

Объект и система объектов: алгоритм

Идеальная объектно-ориентированная концепция может манипулировать только объектами и системами объектов.

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

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

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

Программисты приняли ООП как средство для повышения качества и производительности своей работы, но не уступили ни капли «своей территории» заказчику. Основные понятия ООП - инкапсуляция, наследование, полиморфизм - остались в сфере разработки, а не трансплантировались в сферу задачи.

Объект и система объектов: задача и решение

Компьютер - программист - задача. Среднее звено лишнее. Идеально должно существовать только два, относительно зависимых, контура: (компьютер - программист) - задача. То есть, пользователь, заказчик или посетитель имеет инструмент для решения своей задачи. Как реализован инструмент, заказчика не волнует.

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

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

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

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

Традиционное и объектное программирование

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

Но воз и ныне там: классическое программирование не уступает своих позиций, и многие объектно-ориентированные идеи реализованы классическим кодом.

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

Списки и очереди преобразились, появилось понятие первого и последнего элемента массива, появились циклы «по каждому», а ссылочные варианты именования, использования и исполнения стали ещё более востребованными, чем раньше.

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

Что в основе: объект или система

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

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

Если в основу положить систему объектов, то получается система систем. Это трудно представить в отношении конкретной задачи, и с чего начинать разработку - тоже сложно понять. По большому счёту, полиморфизм ООП c его различиями в сущностях, формах реализации, количествах актуальных параметров в функциях даёт представление о системе, которая лежит в начале, как:

  • о вариантах решения задачи (например, меню);
  • о начальных условиях (применение задачи в разных условиях, данных);
  • о режимах работы (тестирование, настройка, работа).

Но это и подобное ему не даёт никаких оснований ставить в основу решения задачи систему объектов. Часто достаточно определить один единственный начальный объект.

История процесса решения задачи

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

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

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

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

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

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

Реальный полиморфизм ООП, пример

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

Не так давно была разработана библиотека PHPOffice/PHPWord, но для того чтобы использовать её возможности, практически всегда приходится создавать собственную систему объектов. Например, простой файл *.docx:

представляет собой zip-архив множества файлов и папок в формате Office Open XML (OpenXML, OOXML). Каждый файл записан в тегами XML, причём при добавлении, изменении и удалении букв, слов, таблиц, списков и пр. элементов содержимое файлов начинает представлять собой последовательность тегов, которые не всегда содержат полные элементы, часто один элемент записывается множеством тегов.

Если представить этот файл в виде последовательности тегов, получится интересная картинка:

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

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

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

Состояние области ООП

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

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

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

Перспективы объектной идеи

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

Инструментарий ООП - полиморфизм, наследование, инкапсуляция и абстракция - ориентируются на разработчика.

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

Генетический полиморфизм являет собой состояние, при котором отмечается явное разнообразие генов, но несмотря на это частота наименее распространённого гена в популяции будет составлять более 1% Поддержание полиморфизма происходит благодаря постоянного пере-комбинирования и мутирования генов. Согласно результатам последних исследований, проведённых учеными-генетиками, генетический полиморфизм имеет весьма широкую распространённость, ведь комбинирование гена может доходить до нескольких миллионов.

Мутирование генов

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

Все мутации принято подразделять на следующие виды:

    генные - приводящие к переменам последовательности нуклеотидов ДНК в каком-либо отдельном гене, что приводит к изменениям также и в РНК и в белке, кодируемом данным геном. Генные мутирования также подразделяются на 2 категории рецессивные и доминантными. Данный вид мутаций может привести к развитию новых признаков, поддерживающих либо подавляющих жизнедеятельность живого существа.

    генеративное мутирование отражается на половых клетках и передаются при сексуальном контакте;

    соматическое мутирование не отражается на половых клетках, у животных и людей не передаётся от родителей к детям, а у растений может наследоваться в случае вегетативного размножении;

    геномное мутирование отражается на изменении численности хромосом в клеточном кариотипе;

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

К мутированию генов, а, значит, и к повышению распространённости недугов имеющих наследственную природу могут привести следующие составляющие современной жизни:

    Техногенные катастрофические происшествия;

    Загрязнение экологической среды (применение пестицидов, добыча и использование горючего, применение средств бытовой химии);

    Использование лекарственных средств и пищевых добавок, воздействующих на ДНК и РНК;

    Приём в пищу генетически преобразованных продуктов питания;

    Длительное, постоянное, либо особенно сильное кратковременное радиационное излучение.

Мутирование генов - процесс весьма непредсказуемый. Это связано с тем,что заранее предугадать, какой ген, каким образом и в какую сторону мутирует - предугадать практически невозможно. Мутирование генов протекает сам по себе, изменяя наследственные факторы и, на примере такого генетически обусловленного заболевания как тромбофилия, вполне очевидно, что далеко не всегда эти преобразования идут на пользу.

Виды полиморфизма

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

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

Генный полиморфизм и состояние здоровья

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

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

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

Генный полиморфизм фактора Лейдена FV также может значительно усложнить процесс беременности, так как он способен провоцировать привычный выкидыш и способствовать развитию генетических нарушений у ещё нерождённого ребёнка. Кроме того, он может вызвать наступление инфаркта либо инсульта в юном возрасте либо способствовать развитию тромбоэмболии;

Мутирование генов PAI-1 уменьшает активность противостоящей свертыванию системы, по этой причине его принято считать одним из важнейших факторов нормального протекания процесса свёртывания крови.

Развитие таких недугов как тромбоз либо тромбоэмболия - весьма опасны при беременности. Без профессионального медицинского вмешательства они нередко приводят к смертности во время родов как матери, так и ребёнка. Кроме того, роды при наличии этих недугов в большинстве случаев бывают преждевременными.

Когда необходимо сдавать кровь с целью выявления генетических нарушений?

Иметь некоторые сведения о предрасположенности к тем или иным генетическим заболеваниям рекомендуется каждому человеку даже если он не планирует беременность. Подобные знания могут оказать бесценную помощь в профилактике и лечении ускоренного тромбобразования, инфарктов, инсультов, ТЭЛА и других недугов. Однако на сегодняшний день значение информации о своём генетическом фонде играет огромную роль в лечении кардиологических недугов и в акушерском деле.

Таким образом, где назначение анализа на выявление тромбофилии и гемофилии играет особую роль в следующих случаях:

    При планировании беременности;

    При наличии патологических осложнений во время беременности;

    Лечении заболеваний сосудов, сердца, артерий и вен;

    Выяснении причин выкидышей;

    Лечении бесплодия;

    При подготовке к плановым операциям;

    В лечении онкологических новообразований;

    При лечении гормональных нарушений;

    Лицам, страдающим ожирением;

    При лечении эндокринологических болезней;

    При необходимости принимать контрацептивные составы;

    Лицам, занимающимся особенно тяжёлым физическим трудом и пр.

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

  • Почечная недостаточность - нарушение функции почек, при которой наблюдаются резкое уменьшение количества выделяемой мочи, накопление в крови токсических продуктов
  • классы определяется не наборами атрибутов, а семантикой. Так, например, объекты "конюшня" и "лошадь" могут иметь одинаковые атрибуты: цена и возраст. При этом они могут относиться к одному классу , если рассматриваются в задаче просто как товар , либо к разным классам , если в рамках поставленной задачи будут использоваться по -разному, т.е. над ними будут совершаться различные действия.

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

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

    В соответствии с UML ( Unified Modelling Language - унифицированный язык моделирования ), класс имеет следующее графическое представление .

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

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

    • конструктор (constructor) - выполняется при создании объектов ;
    • деструктор ( destructor ) - выполняется при уничтожении объектов .

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

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

    Инкапсуляция (encapsulation) - это сокрытие реализации класса и отделение его внутреннего представления от внешнего (интерфейса). При использовании объектно-ориентированного подхода не принято применять прямой доступ к свойствам какого-либо класса из методов других классов . Для доступа к свойствам класса принято задействовать специальные методы этого класса для получения и изменения его свойств.

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

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

    Благодаря сокрытию реализации за внешним интерфейсом класса можно менять внутреннюю логику отдельного класса , не меняя код остальных компонентов системы. Это свойство называется модульность .

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

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

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

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

    Наследование (inheritance) - это отношение между классами , при котором класс использует структуру или поведение другого класса (одиночное наследование ), или других (множественное наследование ) классов . Наследование вводит иерархию "общее/частное", в которой подкласс наследует от одного или нескольких более общих суперклассов . Подклассы обычно дополняют или переопределяют унаследованную структуру и поведение .

    В качестве примера можно рассмотреть задачу, в которой необходимо реализовать классы "Легковой автомобиль" и "Грузовой автомобиль". Очевидно, эти два класса имеют общую функциональность. Так, оба они имеют 4 колеса, двигатель, могут перемещаться и т.д. Всеми этими свойствами обладает любой автомобиль, независимо от того, грузовой он или легковой, 5- или 12-местный. Разумно вынести эти общие свойства и функциональность в отдельный класс , например, "Автомобиль" и наследовать от него классы "Легковой автомобиль" и "Грузовой автомобиль", чтобы избежать повторного написания одного и того же кода в разных классах .


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

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

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

    Все животные в зоомагазине являются наследниками класса "Животное", а также наследниками класса "Товар". Т.е. все они имеют возраст, нуждаются в пище и воде и в то же время имеют цену и могут быть проданы.

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

    Не все объектно-ориентированные языки программирования содержат языковые конструкции для описания множественного наследования .

    В языке Java множественное наследование имеет ограниченную поддержку через интерфейсы и будет рассмотрено в лекции 8.

    Полиморфизм

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

    Предположим, мы хотим создать векторный графический редактор, в котором нам нужно описать в виде классов набор графических примитивов - Point , Line , Circle , Box и т.д. У каждого из этих классов определим метод draw для отображения соответствующего примитива на экране.

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

    ... //создание пустого массива, который может // содержать объекты Point с максимальным // объемом 1000 Point p = new Point; Line l = new Line; Circle c = new Circle; Box b = new Box; ... // предположим, в этом месте происходит // заполнение всех массивов соответствующими // объектами... for(int i = 0; i < p.length;i++) { //цикл с перебором всех ячеек массива. //вызов метода draw() в случае, // если ячейка не пустая. if(p[i]!=null) p[i].draw(); } for(int i = 0; i < l.length;i++) { if(l[i]!=null) l[i].draw(); } for(int i = 0; i < c.length;i++) { if(c[i]!=null) c[i].draw(); } for(int i = 0; i < b.length;i++) { if(b[i]!=null) b[i].draw(); } ...

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

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

    Лекция в виде презентации в формате pdf с примерами - 27 слайдов.
    ВолгГТУ, кафедра ПОАС, - 2010 год

    В лекции рассмотрены все формы полиморфизма функций и методов т представлена их иерархия в виде схемы.

    Фрагменты из лекции

    Понятие полиморфизма

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

    Преимущества использования полиморфизма

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

    Параметризованный полиморфизм

    • Обеспечивается за счет так называемых обобщенных функций, которые в языке Си++ называются шаблонами
    • Аргументом обобщенной функции является тип, который используется при ее параметризации
    • С помощью механизма шаблонов можно создать функцию, которая бы работала с разнотипными аргументами
    • Примером таких функций являются обобщенные алгоритмы из STL

    Чистый полиморфизм

    • Чистый полиморфизм имеет место, когда одна и та же функция применяется к аргументам различных типов
    • В случае чистого полиморфизма имеется одна функция (тело кода) и несколько ее интерпретаций
    • Реализация чистого полиморфизма возможна только при наличии полиморфных переменных, а точнее полиморфных аргументов
    • Чистый полиморфизм позволяет реализовывать обобщенные алгоритмы
    Перегрузка или полиморфизм ad hoc
    • Перегрузка возникает, когда имеется два или более кода, связанных с одним именем
    • Главное назначение перегрузки − сужение концептуального пространства
    Перегрузка методов в несвязанных классах
    • Все ОО-языки разрешают использовать методы с одинаковыми именами в несвязанных между собою классах − это перегрузка методов
    • В этом случае привязка перегруженного имени производится за счет информации о классе, к которому относится получатель сообщения

    Параметрическая перегрузка

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

    Class MyEllipse
    {
    public:
    float area() const

    };


    {
    public:
    float area() const
    {//использ. более эффективный алгоритм расчета
    }
    };

    MyEllipse ellipse;
    MyCircle circle;

    // Будет вызван метод MyEllipse::area()
    ellipse.print();


    // ВНИМАНИЕ!!! Будет вызван метод MyEllipse::area()
    circle.print();


    Переопределение методов
    • При замещении метод базового класса перекрывается методом производного класса только снаружи. Внутри класса вызывается метод базового класса (см. предыдущий пример)
    • Переопределение метода возникает, когда метод производного класса подменяет метод базового класса не только снаружи, но и внутри класса
    • В языке Си++ для переопределения метода необходимо использовать механизм динамического связывания, т.е. объявить метод виртуальным
    Пример переопределения метода

    Class MyEllipse
    {
    public:
    virtual float area() const
    { /* численный метод расчета */ }
    void print() { printf("area = %f\n", area()); }
    };
    class MyCircle: public MyEllipse
    {
    public:
    float area() const
    { //использ. более эффективн. алгоритм расчета
    return 3.14*Radius1*Radius2;
    }
    };

    MyEllipse ellipse;
    MyCircle circle;

    // Будет вызван метод MyEllipse::area()
    printf("Ellipse area= %f\n", ellipse.area());

    // Будет вызван метод MyEllipse::area()
    ellipse.print();

    // Будет вызван метод MyCircle::area()
    printf("Circle area= %f\n", circle.area());

    // ВНИМАНИЕ!!! Будет вызван метод MyCircle::area()
    circle.print();

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

    Отложенные методы

    • Отложенный метод − это частный случай переопределения, когда метод базового класса не имеет реализации, а любая полезная деятельность задается в методе дочернего класса
    Отложенные методы в языке Си++
    • В языке Си++ отложенный метод должен быть описан в явном виде с ключевым словом virtual
    • Тело отложенного метода не определяется, вместо этого функции «приписывается» значение 0

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

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

    Кратко смысл полиморфизма можно выразить фразой: «Один интерфейс, множество реализаций».

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

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

    внешняя общность проявляется как одинаковый набор методов с одинаковыми именами и сигнатурами (именем методов и типами аргументов и их количеством);

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

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

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

    В объектно-ориентированных языках

    В объектно-ориентированных языках класс является абстрактным типом данных.[Прим. 1] Полиморфизм реализуется с помощью наследования классов и виртуальных функций. Класс-потомок наследует сигнатуры методов класса-родителя, а реализация, в результате переопределения метода, этих методов может быть другой, соответствующей специфике класса-потомка. Другие функции могут работать с объектом как с экземпляром класса-родителя, но если при этом объект на самом деле является экземпляром класса-потомка, то во время исполнения будет вызван метод, переопределенный в классе-потомке. Это называется поздним связыванием. [Примером использования может служить обработка массива, содержащего экземпляры как класса-родителя, так и класса-потомка: очевидно, что такой массив может быть объявлен только как массив типа класса-родителя и у объектов массива могут вызываться только методы этого класса, но если в классе-потомке какие-то методы были переопределены, то в режиме исполнения для экземпляров этого класса будут вызваны именно они, а не методы класса-родителя.]

    Класс-потомок сам может быть родителем. Это позволяет строить сложные схемы наследования - древовидные или сетевидные.

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

    Класс может наследовать функциональность от нескольких классов. Это называется множественным наследованием. Множественное наследование создаёт известную проблему (в C++), когда класс наследуется от нескольких классов-посредников, которые в свою очередь наследуются от одного класса (так называемая «Проблема ромба»): если метод общего предка был переопределён в посредниках, неизвестно, какую реализацию метода должен наследовать общий потомок. Решается эта проблема путём отказа от множественного наследования для классов и разрешением множественного наследования для полностью абстрактных классов (то есть интерфейсов) (C#, Delphi, Java), либо через виртуальное наследование (C++).

    В функциональных языках

    Полиморфизм в функциональных языках будет рассмотрен на примере языка Haskell.





    error: Контент защищен !!