Полиморфизм простыми словами. Реализация полиморфизма

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Показательный пример - библиотека 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, удовлетворит самого искушенного разработчика.

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

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

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

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

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

    Полиморфизм (программирование)

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

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

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

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

    Примеры

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

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

    В Haskell существует два вида полиморфизма - параметрический (чистый) и специальный, (на основе классов ). Специальный называют еще ad hoc (от лат. ad hoc - специально). Их можно отличить следующим образом:

    Параметрический полиморфизм

    Специальный полиморфизм

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

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

    Неявная типизация

    В некоторых языках программирования (например, в Python и Ruby) применяется так называемая утиная типизация (другие названия: латентная, неявная), которая представляет собой разновидность сигнатурного полиморфизма. Таким образом, например, в языке Python полиморфизм не обязательно связан с наследованием.

    Формы полиморфизма

    Статический и динамический полиморфизм

    (упоминается в классической книге Саттера и Александреску, которая является источником).

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

    В одном случае конкретный смысл фрагмента зависит от того, в каком окружении код был построен. Это т.н. статический полиморфизм. Перегрузка функций, шаблоны в Си++ реализуют именно статический полиморфизм. Если в коде шаблонного класса вызвана, например, std::sort, то реальный смысл вызова зависит от того, для каких именно типовых параметров будет развернут данный шаблон - вызовется одна из std::sort.

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

    Полиморфизм включения

    Этот полиморфизм называют чистым полиморфизмом. Применяя такую форму полиморфизма, родственные объекты можно использовать обобщенно. С помощью замещения и полиморфизма включения можно написать один метод для работы со всеми типами объектов TPerson. Используя полиморфизм включения и замещения можно работать с любым объектом, который проходит тест «is-A». Полиморфизм включения упрощает работу по добавлению к программе новых подтипов, так как не нужно добавлять конкретный метод для каждого нового типа, можно использовать уже существующий, только изменив в нем поведение системы. С помощью полиморфизма можно повторно использовать базовый класс; использовать любого потомка или методы, которые использует базовый класс.

    Параметрический полиморфизм

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

    Параметрические методы

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

    Параметрические типы

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

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

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

    Полиморфизм-перегрузка

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

    ПОЛИМОРФИЗМ в генетике (греч, polymorphos многообразный) - термин, обозначающий проявление индивидуальной, прерывистой изменчивости живых организмов. Первоначально он широко использовался для обозначения любой прерывистой изменчивости внутри вида (напр., каст общественных насекомых, возрастных отличий в окраске, полового диморфизма и др.), однако позже такие различия стали называть полифенизмом, а термином «полиморфизм» в соответствии с определением, данным английским генетиком Фордом (E. В. Ford), обозначать наличие в одной и той же популяции двух или более хорошо различимых форм, способных появляться в потомстве одной самки и встречающихся с частотой, достаточно высокой для того, чтобы исключить поддержание самой редкой из них повторно возникающими мутациями. Понятие «полиморфный» следует также отличать от понятия «политипический», к-рое обозначает сложные таксономические категории (напр., политипический вид - вид, представленный двумя или более подвидами, и т. п.).

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

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

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

    Биол, значение такой широкой наследственной изменчивости популяций и видов до конца не расшифровано, и по этому вопросу существует две точки зрения. Согласно одной из них биохим. П. поддерживается в популяциях благодаря отбору, т. е. имеет приспособительное значение, согласно другой - биохим. П. должен быть отнесен к категории селективно-нейтральной изменчивости. Тем не менее существует множество достоверных фактов, свидетельствующих об исключительном значении явления генетического П. для биологии и медицины. Постоянное присутствие в популяции с достаточно высокой частотой двух или более дискретных форм - генотипов (см.) - означает, что такой П. поддерживается за счет преимущественного отбора гетерозигот. Примером этого может служить полиморфизм гемоглобина, широко распространенный в популяциях людей азиатского и африканского происхождения и приводящий к заболеванию, известному под названием серповидно-клеточной анемии (см.). Анемия связана с гомозиготностью по гену s, который обусловливает образование аномального гемоглобина. Гомозиготы ss погибают вскоре после рождения. Однако стало известно, что высокая частота этого гена в популяциях сохраняется благодаря тому, что гетерозиготы Ss менее поражаются малярией, чем гомозиготы SS. В условиях постоянного присутствия в окружающей среде возбудителя малярии в популяциях поддерживается устойчивое соотношение всех трех генотипов - SS, Ss и ss, так наз. сбалансированный полиморфизм.

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

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

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

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

    ПОЛИМОРФИЗМ в патологии

    ПОЛИМОРФИЗМ в патологии (греч. polymorphos многообразный) - многообразие структурных проявлений патологического процесса в органах, тканях и клетках.

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

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

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

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

    ПОЛИМОРФИЗМ в химии

    ПОЛИМОРФИЗМ в химии (греч. polymorphous многообразный) - способность одного и того же химического соединения или элемента образовывать в зависимости от внешних условий (температуры, давления и др.) различные кристаллические формы (модификации). П. объясняют способностью одних и тех же атомов или молекул образовывать различные кристаллические решетки, отличающиеся своей устойчивостью. Явление П. в химии открыто Мичерлихом (E. Mitscherlich) в 1821 г. П. наблюдается для простых веществ (так наз. аллотропия), для многих органических и неорганических соединений, а также для минералов. Примерами аллотропных простых веществ могут служить алмаз и графит, белый и фиолетовый (красный) фосфор и др. Примером П. хим. соединений могут служить кальцит и арагонит - полиморфные модификации карбоната кальция. Известны два основных вида П.: энантиотро-пия (обратимые превращения) и мо-нотропия (необратимые превращения).

    Вещества, находящиеся в различных полиморфных модификациях, обладают разными физ.-хим. свойствами и разной биол, активностью; напр., рост гемофильных бактерий на синтетической среде, заменяющей кровь, происходит при наличии в среде гамма-Fe 2 O 3 , а в присутствии aльфа-Fe 2 O 3 бактерии погибают.

    Библиография:

    полиморфизм в генетике

    Алтухов Ю. П. и Рычков Ю. Г. Генетический мономорфизм видов и его возможное биологическое значение, Журн. общ. биол., т. 33, № 3, с. 281, 1972; Бочков Н. П. Генетика человека, М., 1978; Майр Э. Популяции, виды и эволюция, пер. с англ., М., 1974; Харрис Г. Основы биохимической генетики человека, пер. с англ., М., 1973; Эрлих П. и Холм Р. Процесс эволюции, пер. с англ., М., 1966; С a v а 1 1 i - S f о г z a L. L. a. Bod- ш e г W. F. The genetics of human populations, San Francisco, 1971; Ford E. B. Polymorphism and taxonomy, в кн.: The new systematics, ed. by J. Huxley, p. 493, L., 1941.

    полиморфизм в патологии

    Давыдовский И. В. Общая патология человека, с. 506, М., 1969; С т р у к о в А. И. и Серов В. В. Патологическая анатомия с. 159, М., 1979.

    полиморфизм в химии

    Некрасов Б. В. Учебник общей химии, с. 382, М., 1981; Не-н и ц e с к у К. Общая химия, пер. с румын., с. 130, М., 1968.

    Ю. П. Алтухов (полиморфизм в генетике), Г. М. Могилевский (полиморфизм в патологии),

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

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

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

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

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

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

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

    В языке PHP концепция инкапсуляции реализована в виде специальных модификаторов доступа к полям и методам классов. Об этом мы поговорим далее.

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

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

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

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

    Это значит, что в классах Квадрат и Треугольник нам не придется повторно задавать поля цвета и площади. Достаточно указать, что упомянутые классы наследуются от класса Фигура.

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

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

    Чтобы реализовать эту ситуацию в PHP, нам потребуется определить два класса: класс для обычной статьи-заметки и класс для новостной статьи. При этом пусть новостная статья расширяет возможности обычной статьи, т. е. наследуется от нее. Для наследования классов в PHP используется ключевое слово extends .

    Class { ... // содержимое класса } class { ... // содержимое класса }

    Приведенный код определяет класс NewsArticle как наследника Article . Класс Article в свою очередь является родительским для класса NewsArticle . Это значит, что поля и методы класса Article будут также присутствовать в классе NewsArticle , и заново их определять не нужно.

    С помощью наследования можно выстраивать целую иерархию классов, наследуя один от другого. В то же время у любого класса может быть только один родитель:


    Иногда у нас может появиться необходимость переопределить один из методов родительского класса. Давайте еще раз приведем реализацию класса Article :

    Class Article { ... // поля класса // Функция для вывода статьи function view() { echo "

    $this->title

    $this->content

    "; } }

    Предположим, что вывод новостной статьи должен отличаться от представления обычной статьи, и мы должны дополнительно выводить время публикации новости. При этом в классе Article уже существует метод view() , отвечающий за вывод статьи. Можно поступить двумя способами. В первом случае можно придумать новый метод в классе NewsArticle , например, с именем viewNews() специально для вывода новости. Однако правильнее использовать одинаковые методы для выполнения схожих действий в наследуемых классах. Поэтому будет лучше, если метод для вывода новости в классе NewsArticle будет называться так же, как и в родительском классе - view() . Для реализации такой логики в PHP существует возможность переопределять родительские методы, т. е. задавать в дочерних классах методыс названиями, совпадающими в родительских классах. Реализация этих методов в родительских классах в таком случае становится неактуальной для класса-потомка. Давайте приведем пример класса NewsArticle с переопределенным методом view() :

    Class NewsArticle extends Article { $datetime; // дата публикации новости // Функция для вывода статьи function view() { echo "

    $this->title

    ". strftime("%d.%m.%y", $this->datetime). " Новость

    $this->content

    "; } }

    В приведенном коде используется функция strftime() , которая позволяет выводить даты в удобном виде. Для лучшего понимания кода ознакомьтесь со спецификацией этой функции в справочнике. Для нас же сейчас важно, чтобы вы обратили внимание на то, что класс NewsArticle , как и Article , определяет метод view() . Соответственно, все объекты этого класса будут использовать метод view() , объявленный в классе NewsArticle , а не в Article .

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

    Полиморфизм

    Полиморфизм - взаимозаменяемость объектов с одинаковым интерфейсом.

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

    Давайте рассмотрим следующий пример, который дает представление о сути полиморфизма :

    Class A { function Test() { echo "Это класс A
    "; } function Call() { $this->Test(); } } class B extends A { function Test() { echo "Это класс B
    "; } } $a = new A(); $b = new B(); $a->Call(); // выводит: "Это класс A" $b->Test(); // выводит: "Это класс B" $b->

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

    $a->Call(); // выводит: "Это класс A"

    В этой строке происходит вызов метода Call() у объекта класса А . Как и определено в функции Call() класса A , происходит вызов метода Test() . Отрабатывает метод Test() у объекта класса A , и на экран выводится текст "Это класс А ".

    $b->Test(); // выводит: "Это класс B"

    В данной строке происходит вызов метода Test() у объекта класса B . Метод Test() класса B выводит на экран текст "Это класс В ".

    $b->Call(); // выводит: "Это класс B"

    Наконец, в последней строке происходит вызов класса Call() у объекта класса В . Но в реализации класса B мы не увидим такого метода, а это значит, что он наследуется от класса A , т. к. класс B - это потомок класса A . Что же мы видим в реализации метода Call() класса A ? Следующий код:

    $this->Test();

    Метод Call() вызывает метод Test() того объекта, в котором находится. Это значит, что отработает метод Test() объекта класса B . Именно этим объясняется результат, выведенный на экране.

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

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

    Статьи по теме: