Презентация Polymorphism. Создание проекта онлайн

На нашем сайте вы можете скачать и просмотреть онлайн доклад-презентацию на тему Polymorphism. Создание проекта абсолютно бесплатно. Урок-презентация на эту тему содержит всего 47 слайдов. Все материалы созданы в программе PowerPoint и имеют формат ppt или же pptx. Материалы и темы для презентаций взяты из открытых источников и загружены их авторами, за качество и достоверность информации в них администрация сайта не отвечает, все права принадлежат их создателям. Если вы нашли то, что искали, отблагодарите авторов - поделитесь ссылкой в социальных сетях, а наш сайт добавьте в закладки.
Презентации » Устройства и комплектующие » Polymorphism. Создание проекта



Оцените!
Оцените презентацию от 1 до 5 баллов!
  • Тип файла:
    ppt / pptx (powerpoint)
  • Всего слайдов:
    47 слайдов
  • Для класса:
    1,2,3,4,5,6,7,8,9,10,11
  • Размер файла:
    673.00 kB
  • Просмотров:
    102
  • Скачиваний:
    0
  • Автор:
    неизвестен



Слайды и текст к этой презентации:

№1 слайд
Polymorphism
Содержание слайда: Polymorphism

№2 слайд
Предупреждение В данной
Содержание слайда: Предупреждение В данной презентации почти все примеры кода написаны на языке С++. Примеры рабочие, и будут запускаться в IDE Microsoft Visual Studio 2013/2015. Язык C++, по сравнению с Java, предоставляет более широкий выбор инструментов для понимания того, что происходит «под капотом» программы. Наличие в нём операторов для получения адресов объектов в памяти и определения точного размера объектов в байтах, простое переключение между ранним и поздним связыванием, работа с таблицей виртуальных методов в отладчике, позволит понять новую тему во всех деталях.

№3 слайд
Создание проекта
Содержание слайда: Создание проекта

№4 слайд
Ставим чекбокс Пустой проект
Содержание слайда: Ставим чекбокс «Пустой проект»

№5 слайд
Добавляем cpp-файл
Содержание слайда: Добавляем cpp-файл

№6 слайд
Транспортные средства https
Содержание слайда: Транспортные средства https://git.io/vrqav

№7 слайд
Работа примера Каждый класс,
Содержание слайда: Работа примера Каждый класс, отнаследованный от Transport, получает метод Drive. (т.е., наследники обладают общим интерфейсом). Однако, каждое конкретное транспортное средство будет ехать по-своему (разные реализации, т.к. методы переопределены). Если создать несколько объектов разных подклассов, то компилятор поступит вполне предсказуемо, и вызовет метод Drive из класса Car для объекта типа Car, и метод Drive из класса Bike для объекта типа Bike.

№8 слайд
Раннее связывание На что при
Содержание слайда: Раннее связывание На что при этом ориентируется компилятор? В данном случае, на тип указателя (ссылки), который содержит адрес объектной переменной. Причём тип указателя точно известен на этапе компиляции, а это означает, что связывание вызова метода через этот указатель на объект с кодом реализации метода Drive происходит на этапе построения приложения. Такой процесс называется раннее связывание (static dispatch).

№9 слайд
Моделирование Предположим, в
Содержание слайда: Моделирование Предположим, в программе необходимо смоделировать поведение различных видов транспорта на перекрёстке. Всё просто: как только на светофоре загорится зелёный - все машинки должны поехать.

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

№11 слайд
Проблема Обычно для работы с
Содержание слайда: Проблема Обычно для работы с группой объектов используются массивы либо другие коллекции, вроде списков или деревьев. Но ведь транспортные средства у нас будут с разными типами! А в коллекциях все элементы всегда однотипные…

№12 слайд
Решение Для решения этой
Содержание слайда: Решение Для решения этой проблемы придумали одну очень хитрую вещь: разрешается делать ссылку на объект с типом базового класса, и в дальнейшем присваивать е й адреса объектов производного типа (но не наоборот!) Transport t = new Car(); // Transport* t = new Car(); // код С++

№13 слайд
Массив ссылок на объекты
Содержание слайда: Массив ссылок на объекты Теперь можно будет создать целый массив ссылок типа базового класса, и поочерёдно присвоить им адреса объектов различных производных типов. Таким образом решается проблема хранения разнотипных объектов (однако имеющих общего предка!) в виде массива. Transport** ar = new Transport*[2]; ar[0] = new Bike(); ar[1] = new Telega();

№14 слайд
Доверяй, но проверяй Итак,
Содержание слайда: Доверяй, но проверяй Итак, попробуем применить новые знания на практике: https://git.io/vrqyZ

№15 слайд
Что-то пошло не так Упс! При
Содержание слайда: Что-то пошло не так… Упс! При попытке моделирования ситуации на светофоре, программа сработала не совсем так, как хотелось бы. Всему виной – то самое раннее связывание. Ну в самом деле, метод Drive вызывается через указатель traffic[i], а ведь это указатель c типом Transport... Соответственно, компилятор берёт и вызывает метод именно из класса Transport. В итоге, и мотоциклы, и телеги, и машины поедут каким-то общесхематическим образом (таким, как это определено в классе Transport).

№16 слайд
Позднее связывание Для того,
Содержание слайда: Позднее связывание Для того, чтобы в С++ сменить механизм с раннего связывания на позднее, достаточно пометить метод Drive в базовом классе Transport как virtual. Метод станет виртуальным, и связывание вызова метода через указатель (ссылку) на объект с кодом реализации метода будет происходить уже на этапе выполнения программы, а не на этапе компиляции.

№17 слайд
Правило виртуальности
Содержание слайда: Правило виртуальности Получается, что наличие в коде ключевого слова virtual решило все проблемы по работе с разнотипными объектами! Существует правило виртуальности: метод, объявленный виртуальным в некотором классе, остаётся таким во всех классах-потомках. Но для наглядности в C++ рекомендуется писать ключевое слово virtual и в классах-наследниках, чтобы код оставался читабельным и понятным.

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

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

№20 слайд
Важнейшая концепция ООП
Содержание слайда: Важнейшая концепция ООП Полиморфизм – важнейшая концепция в ООП. Большинство лучших практик и решений основаны на полиморфизме и глубокое понимание принципов и тонкостей работы данного механизма является обязательным для построения гибкой и надёжной архитектуры ПО!

№21 слайд
Определение Полиморфизм это
Содержание слайда: Определение Полиморфизм – это принцип, согласно которому есть возможность использовать одну и ту же запись для работы с объектами различных типов данных. Кратко: «один интерфейс, множество реализаций». Полиморфизм позволяет единообразно работать с объектами различных типов, подменяя только сами объекты, но не код по их обработке.

№22 слайд
Полиморфная строка кода for
Содержание слайда: Полиморфная строка кода for (int i = 0; i < count; i++) traffic[i]->Drive();

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

№24 слайд
Статический полиморфизм
Содержание слайда: Статический полиморфизм Ad-hoc полиморфизм. Реализуется через механизм перегрузки методов – эта тема вам уже хорошо знакома. Параметрический полиморфизм. Реализуется через механизм обобщений (generics, дженериков) – с этим будем разбираться после темы «интерфейсы».

№25 слайд
Динамический полиморфизм
Содержание слайда: Динамический полиморфизм Динамический полиморфизм – это механизм, при котором одна и та же инструкция может быть использована для работы с объектами разных типов, но конкретный тип и инструкции по работе с ним НЕ известны на этапе компиляции, а определяются на этапе выполнения (реализуется т.н. полиморфное поведение).

№26 слайд
Диспетчеризация Для
Содержание слайда: Диспетчеризация Для реализации динамического полиморфизма используется subtype polymorphism, то есть ДП реализуется только через механизм наследования. Для понимания реализации полиморфного поведения, необходимо как-то выяснить, каким образом выбирается конкретная реализация, которую нужно вызвать для объекта. Для определения конкретного метода при вызове используется механизм связывания (диспетчеризация, dispatch).

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

№28 слайд
Механизм позднего связывания
Содержание слайда: Механизм позднего связывания При работе через ссылку базового типа с объектом производного класса, часто требуется, чтобы связывание вызова метода с самим кодом метода происходило именно на этапе выполнения программы. То есть, чтобы вызывался метод в соответствии с настоящим типом объекта, а не типом ссылки, которая содержит адрес данного объекта. Для решения данной проблемы в базовом классе (в С++) переопределяемый метод помечается как виртуальный. А в производных классах, этот виртуальный метод просто переопределяется.

№29 слайд
Как это всё работает? Для
Содержание слайда: Как это всё работает? Для начала, рассмотрим пример: https://git.io/vr1BB Пример демонстрирует, как можно получить адреса объектов, их полей и методов.

№30 слайд
Добавим наследование Теперь
Содержание слайда: Добавим наследование Теперь примерно то же самое, но с наследованием: https://git.io/vr1RT

№31 слайд
Время экспериментов Теперь
Содержание слайда: Время экспериментов Теперь попробуйте сделать метод Guard виртуальным (virtual можно писать как до типа возвращаемого значения, так и после него). Что изменилось? А теперь сделайте виртуальным ещё и метод Bark. Что-то изменилось?

№32 слайд
Загадочные байта По всей
Содержание слайда: Загадочные 4 байта По всей видимости, пометка хотя бы одного, или пусть даже нескольких методов в классе как virtual, приводит к тому, что размер каждого объекта класса будет увеличен на 4 байта. Откуда они берутся? Вообще, 4 – оптимальное количество байт для хранения адреса какого-нибудь объекта. Запустим отладчик VS 2015.

№33 слайд
Скрин отладчика
Содержание слайда: Скрин отладчика

№34 слайд
Таблица виртуальных методов
Содержание слайда: Таблица виртуальных методов Итак, наличие виртуального метода в классе привело к появлению поля под названием __vfptr. Название это расшифровывается как virtual functions pointer, или «указатель на таблицу виртуальных методов». На самом деле, это скорее не таблица, а самый обычный одномерный массив, в котором хранятся адреса всех виртуальных методов класса.

№35 слайд
Один класс одна таблица Важно
Содержание слайда: Один класс – одна таблица Важно понять, что на каждый класс, в котором заявлены виртуальные методы, будет по одной таблице ВМ. Так, например, компилятор создаёт одну таблицу для класса Dog, и ещё одну таблицу для класса PugDog. В то время, как у каждого объекта этих классов будет по одному указателю на определённую таблицу ВМ.

№36 слайд
Пример https git.io vr A
Содержание слайда: Пример https://git.io/vr16A Почитать дома: https://habrahabr.ru/post/51229/ https://en.wikipedia.org/wiki/Virtual_method_table

№37 слайд
UML-диаграмма
Содержание слайда: UML-диаграмма

№38 слайд
За всё приходится платить
Содержание слайда: За всё приходится платить Виртуальный вызов требует выполнения такой операции, как индексированное разыменование. Поэтому вызов виртуальных методов по сути медленнее, чем вызов невиртуальных. Опыты показывают, что примерно 6-13% времени исполнения тратится просто на поиск соответствующего метода.

№39 слайд
virtual в Java Так как на
Содержание слайда: virtual в Java Так как на практике чаще всего ожидается вызов метода именно из класса объекта, а не из класса ссылки на объект, то в Java механизм позднего связывания реализован по умолчанию для всех методов, и помечать их как virtual необходимости нет – всё и так работает, как надо. Но «под капотом» всё работает точно также, как и в С++!

№40 слайд
Позднее связывание в Java Тот
Содержание слайда: Позднее связывание в Java Тот же пример, переписанный уже на языке Java, демонстрирует факт, что позднее связывание работает без каких-либо дополнительных действий со стороны программиста: https://git.io/vr1yz

№41 слайд
Запрет переопределения
Содержание слайда: Запрет переопределения Существует возможность запретить переопределение метода, пометив его как final. Сделано это для того, чтобы гарантированно зафиксировать задуманное поведение метода без возможности его изменения в будущем. А статические методы вообще не участвуют в процессе переопределения (проверить это, пометив метод как static).

№42 слайд
overload vs override
Содержание слайда: overload vs override

№43 слайд
Формальное преобразование
Содержание слайда: Формальное преобразование Механизм наследования классов предусматривает возможности преобразования типов между суперклассом и подклассом. Преобразование типов в каком-то смысле является формальным. Сам объект при таком преобразовании не изменяется, преобразование относится только к типу ссылки на объект.

№44 слайд
Upcasting и downcasting
Содержание слайда: Upcasting и downcasting Формальное преобразование, от подкласса к суперклассу (upcasting): Object o = new Dog(); Понижающее преобразование, от суперкласса к подклассу (downcasting): Dog d = (Dog)o;

№45 слайд
Ограничения downcasting
Содержание слайда: Ограничения downcasting Downcasting может задаваться только явно, при помощи операции преобразования типов Объект, подвергаемый преобразованию, реально должен быть того класса, к которому он преобразуется. Если это не так, то возникнет исключение ClassCastException.

№46 слайд
instanceof В Java для
Содержание слайда: instanceof В Java для проверки типа объекта есть операция instanceof. Она часто применяется при понижающем преобразовании (downcasting). Эта операция проверяет отношение левого операнда к классу, заданному правым операндом. if (o instanceof Dog) return true;

№47 слайд
RTTI Оператор instanceof
Содержание слайда: RTTI Оператор instanceof относится к механизму динамической идентификации типа данных (run-time type information, run-time type identification), который позволяет определить тип данных объекта во время выполнения программы. https://ru.wikipedia.org/wiki/%D0%94%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F_%D0%B8%D0%B4%D0%B5%D0%BD%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%8F_%D1%82%D0%B8%D0%BF%D0%B0_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85

Скачать все slide презентации Polymorphism. Создание проекта одним архивом: