Что такое полиморфная структура

Наследование и полиморфизм

Полиморфизм

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

Структура наследования, рассмотренная выше, делает допустимым присваивание :

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

Что такое полиморфная структура. Смотреть фото Что такое полиморфная структура. Смотреть картинку Что такое полиморфная структура. Картинка про Что такое полиморфная структура. Фото Что такое полиморфная структура

Определения

Нам нужна подходящая для этой ситуации терминология.

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

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

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

Напоминаю, что «сущности» включают переменные (атрибуты, локальные переменные), а также формальные аргументы методов и Result.

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

Тогда вызов этого метода является вполне корректным:

Несмотря на свое имя — от греческого словосочетания «множественность форм» — полиморфизм не является причиной изменения во время выполнения объектом своей «формы» (изменением типа). Полиморфное присоединение применимо только к ссылочным типам с эффектом, показанным на последнем рисунке, — изменяются ссылки, но сами объекты не меняют тип.

Мы не будем более останавливаться на механизмах преобразования. Если необходимо его использовать, то можно проанализировать для начала класс REAL32 в EiffelBase (смотри предложение convert ), этого будет достаточно для понимания основных идей трансформации.

Что же касается нашего обсуждения, то следует понимать, что трансформация и полиморфизм являются взаимоисключающими механизмами: если применяется один из них, то второй не применяется. Так что, когда вы видите присваивание a:=b или когда речь идет о передаче аргумента при вызове метода, то никогда не возникает неопределенность, из контекста всегда ясно, с каким случаем мы имеем дело.

Полиморфные структуры данных

Особый интерес представляет последний случай в определении полиморфизма — полиморфная структура данных, называемая также полиморфным контейнером. Рассмотрим типичный контейнер — список, предназначенный для хранения транспортных средств:

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

Что такое полиморфная структура. Смотреть фото Что такое полиморфная структура. Смотреть картинку Что такое полиморфная структура. Картинка про Что такое полиморфная структура. Фото Что такое полиморфная структура

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

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

И третье: все будет хорошо — и это настоящий ответ! Существуют способы проверки того, чем является полученный объект, является ли он в самом деле такси в данном конкретном выполнении, и если да, то вызов take можно сделать законным. Но прежде чем узнать, как это делается, придется прочесть еще несколько десятков страниц. Разве я не говорил вам, что жизнь полна несправедливостей?

Источник

Наследование и полиморфизм

Полиморфизм

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

Структура наследования, рассмотренная выше, делает допустимым присваивание :

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

Что такое полиморфная структура. Смотреть фото Что такое полиморфная структура. Смотреть картинку Что такое полиморфная структура. Картинка про Что такое полиморфная структура. Фото Что такое полиморфная структура

Определения

Нам нужна подходящая для этой ситуации терминология.

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

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

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

Напоминаю, что «сущности» включают переменные (атрибуты, локальные переменные), а также формальные аргументы методов и Result.

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

Тогда вызов этого метода является вполне корректным:

Несмотря на свое имя — от греческого словосочетания «множественность форм» — полиморфизм не является причиной изменения во время выполнения объектом своей «формы» (изменением типа). Полиморфное присоединение применимо только к ссылочным типам с эффектом, показанным на последнем рисунке, — изменяются ссылки, но сами объекты не меняют тип.

Мы не будем более останавливаться на механизмах преобразования. Если необходимо его использовать, то можно проанализировать для начала класс REAL32 в EiffelBase (смотри предложение convert ), этого будет достаточно для понимания основных идей трансформации.

Что же касается нашего обсуждения, то следует понимать, что трансформация и полиморфизм являются взаимоисключающими механизмами: если применяется один из них, то второй не применяется. Так что, когда вы видите присваивание a:=b или когда речь идет о передаче аргумента при вызове метода, то никогда не возникает неопределенность, из контекста всегда ясно, с каким случаем мы имеем дело.

Полиморфные структуры данных

Особый интерес представляет последний случай в определении полиморфизма — полиморфная структура данных, называемая также полиморфным контейнером. Рассмотрим типичный контейнер — список, предназначенный для хранения транспортных средств:

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

Что такое полиморфная структура. Смотреть фото Что такое полиморфная структура. Смотреть картинку Что такое полиморфная структура. Картинка про Что такое полиморфная структура. Фото Что такое полиморфная структура

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

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

И третье: все будет хорошо — и это настоящий ответ! Существуют способы проверки того, чем является полученный объект, является ли он в самом деле такси в данном конкретном выполнении, и если да, то вызов take можно сделать законным. Но прежде чем узнать, как это делается, придется прочесть еще несколько десятков страниц. Разве я не говорил вам, что жизнь полна несправедливостей?

Источник

Наследование и полиморфизм

Полиморфизм

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

Структура наследования, рассмотренная выше, делает допустимым присваивание :

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

Что такое полиморфная структура. Смотреть фото Что такое полиморфная структура. Смотреть картинку Что такое полиморфная структура. Картинка про Что такое полиморфная структура. Фото Что такое полиморфная структура

Определения

Нам нужна подходящая для этой ситуации терминология.

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

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

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

Напоминаю, что «сущности» включают переменные (атрибуты, локальные переменные), а также формальные аргументы методов и Result.

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

Тогда вызов этого метода является вполне корректным:

Несмотря на свое имя — от греческого словосочетания «множественность форм» — полиморфизм не является причиной изменения во время выполнения объектом своей «формы» (изменением типа). Полиморфное присоединение применимо только к ссылочным типам с эффектом, показанным на последнем рисунке, — изменяются ссылки, но сами объекты не меняют тип.

Мы не будем более останавливаться на механизмах преобразования. Если необходимо его использовать, то можно проанализировать для начала класс REAL32 в EiffelBase (смотри предложение convert ), этого будет достаточно для понимания основных идей трансформации.

Что же касается нашего обсуждения, то следует понимать, что трансформация и полиморфизм являются взаимоисключающими механизмами: если применяется один из них, то второй не применяется. Так что, когда вы видите присваивание a:=b или когда речь идет о передаче аргумента при вызове метода, то никогда не возникает неопределенность, из контекста всегда ясно, с каким случаем мы имеем дело.

Полиморфные структуры данных

Особый интерес представляет последний случай в определении полиморфизма — полиморфная структура данных, называемая также полиморфным контейнером. Рассмотрим типичный контейнер — список, предназначенный для хранения транспортных средств:

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

Что такое полиморфная структура. Смотреть фото Что такое полиморфная структура. Смотреть картинку Что такое полиморфная структура. Картинка про Что такое полиморфная структура. Фото Что такое полиморфная структура

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

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

И третье: все будет хорошо — и это настоящий ответ! Существуют способы проверки того, чем является полученный объект, является ли он в самом деле такси в данном конкретном выполнении, и если да, то вызов take можно сделать законным. Но прежде чем узнать, как это делается, придется прочесть еще несколько десятков страниц. Разве я не говорил вам, что жизнь полна несправедливостей?

Источник

Полиморфизм для начинающих

Постановка задачи

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

Самые простые варианты, которые приходят в голову — написать три отдельных класса и работать с ними. Или написать один класс, в которым будут все свойства, присущие всем трем типам публикаций, а задействоваться будут только нужные. Но ведь для разных типов аналогичные по логике методы должны работать по-разному. Делать несколько однотипных методов для разных типов (get_news, get_announcements, get_articles) — это уже совсем неграмотно. Тут нам и поможет полиморфизм.

Абстрактный класс

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

// а этот метод должен напечатать публикацию, но мы не знаем, как именно это сделать, и потому объявляем его абстрактным
abstract public function do_print ();
>

Производные классы

Теперь можно перейти к созданию производных классов, которые и реализуют недостающую функциональность.

Теперь об использовании

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

Вот и все. Легким движением руки брюки превращаются в элегантные шорты :-).

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

Немного теории

Источник

Полиморфные структуры данных

Полиморфные структуры данных

Рассмотрим массив многоугольников:

poly_arr: ARRAY [POLYGON]

Когда некоторое значение x присваивается элементу этого массива, как в вызове

poly_arr.put (x, some_index)

(для некоторого допустимого значения индекса some_index), то спецификация класса ARRAY указывает, что тип присваиваемого значения должен быть согласован с типом фактического родового параметра:

class ARRAY [G] creation

put (v: G; i: INTEGER) is

— Присвоить v элементу с индексом i

Поэтому, если границы массива равны 1 и 4, то можно объявить некоторые сущности:

p: POLYGON; r: RECTANGLE; s: SQUARE; t: TRIANGLE

и, создав соответствующие объекты, можно выполнить операции

которые присвоят элементам массива ссылки на объекты различных типов.

Рис. 14.4. Полиморфный массив

На этом рисунке графические объекты представлены соответствующими геометрическими фигурами, а не обычными диаграммами объектов с набором их полей.

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

Рис. 14.5. Измерения обобщения

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

LIST [RECTANGLE]: может содержать квадраты, но не треугольники.

LIST [POLYGON]: может содержать квадраты, прямоугольники, треугольники, но не круги.

LIST [FIGURE]: может содержать экземпляры любого типа из иерархии FIGURE, но не книги или банковские счета.

LIST [ANY]: может содержать объекты любого типа.

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

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

Читайте также

Объекты VFS и их структуры данных

Объекты VFS и их структуры данных Виртуальная файловая система (VFS) объектно-ориентированна[69]. Общая файловая модель представлена набором структур данных. Эти структуры данных очень похожи на объекты. Так как ядро программируется строго на языке С, то, при отсутствии

Структуры данных

Структуры данных Первое, в чем следует разобраться, — это структуры данных, которые управляют работой библиотеки:• управляющая структура resmgr_attr_t• таблица функций установления соединения resmgr_connect_funcs_t• таблица функций ввода-вывода resmgr_io_funcs_t и еще одна внутренняя

11.7.1. Структуры данных

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

Структуры данных процесса

Структуры данных

Структуры данных Структура данных socket, описывающая сокет, представлена на рис. 6.21. В этой структуре хранится информация о типе сокета (so_type), его текущем состоянии (so_state) и используемом протоколе (so_proto). Рис. 6.21. Структуры данных сокетаСокет является коммуникационным узлом

2.3 СТРУКТУРЫ ДАННЫХ ЯДРА

2.3 СТРУКТУРЫ ДАННЫХ ЯДРА Большинство информационных структур ядра размещается в таблицах фиксированного размера, а не в динамически выделенной памяти. Преимущество такого подхода состоит в том, что программа ядра проста, но в ней ограничивается число элементов

1. Абстрактные структуры данных

1. Абстрактные структуры данных Структурированные типы данных, такие как массивы, множества, записи, представляют собой статические структуры, так как их размеры неизменны в течение всего времени выполнения программы.Часто требуется, чтобы структуры данных меняли свои

ЛЕКЦИЯ № 9. Древовидные структуры данных

ЛЕКЦИЯ № 9. Древовидные структуры данных 1. Древовидные структуры данных Древовидной структурой данных называется конечное множество элементов-узлов, между которыми существуют отношения – связь исходного и порожденного.Если использовать рекурсивное определение,

1. Древовидные структуры данных

1. Древовидные структуры данных Древовидной структурой данных называется конечное множество элементов-узлов, между которыми существуют отношения – связь исходного и порожденного.Если использовать рекурсивное определение, предложенное Н. Виртом, то древовидная

Проектирование структуры данных

Проектирование структуры данных Как и построение здания, построение базы данных начинается с проектирования. Чтобы понять, какая структура базы будет для вас наиболее удобной и полезной, следуйте нижеприведенным этапам проектирования.1. Для начала необходимо выяснить,

6.1. Оптимизация структуры данных

6.1. Оптимизация структуры данных Если «узким местом» вашей базы данных является одна или несколько таблиц, попробуем скорректировать структуру этих таблиц:• выбрать наиболее подходящий тип таблицы;• минимизировать объем данных в таблице;• пересмотреть набор

14. Структуры и другие типы данных

1.17 Полиморфные Вектора

1.17 Полиморфные Вектора У вас есть другая возможность – определить ваш векторный и другие вмещающие классы через указатели на объекты некоторого класса: class common (* //. *); class vector (* common** v; //. public: cvector(int); common* amp; elem(int); common* amp; operator[](int); //. *);Заметьте, что поскольку в таких

6.2. Типы и структуры данных

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

17. Абстрактные структуры данных

17. Абстрактные структуры данных Структурированные типы данных, такие как массивы, множества, записи, представляют собой статические структуры, так как их размеры неизменны в течение всего времени выполнения программы.Часто требуется, чтобы структуры данных меняли свои

20. Древовидные структуры данных

20. Древовидные структуры данных Древовидной структурой данных называется конечное множество элементов-узлов, между которыми существуют отношения – связь исходного и порожденного.Если использовать рекурсивное определение, предложенное Н. Виртом, то древовидная

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *