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

Нажмите для полного просмотра!
Polymorphism. Создание проекта, слайд №1 Polymorphism. Создание проекта, слайд №2 Polymorphism. Создание проекта, слайд №3 Polymorphism. Создание проекта, слайд №4 Polymorphism. Создание проекта, слайд №5 Polymorphism. Создание проекта, слайд №6 Polymorphism. Создание проекта, слайд №7 Polymorphism. Создание проекта, слайд №8 Polymorphism. Создание проекта, слайд №9 Polymorphism. Создание проекта, слайд №10 Polymorphism. Создание проекта, слайд №11 Polymorphism. Создание проекта, слайд №12 Polymorphism. Создание проекта, слайд №13 Polymorphism. Создание проекта, слайд №14 Polymorphism. Создание проекта, слайд №15 Polymorphism. Создание проекта, слайд №16 Polymorphism. Создание проекта, слайд №17 Polymorphism. Создание проекта, слайд №18 Polymorphism. Создание проекта, слайд №19 Polymorphism. Создание проекта, слайд №20 Polymorphism. Создание проекта, слайд №21 Polymorphism. Создание проекта, слайд №22 Polymorphism. Создание проекта, слайд №23 Polymorphism. Создание проекта, слайд №24 Polymorphism. Создание проекта, слайд №25 Polymorphism. Создание проекта, слайд №26 Polymorphism. Создание проекта, слайд №27 Polymorphism. Создание проекта, слайд №28 Polymorphism. Создание проекта, слайд №29 Polymorphism. Создание проекта, слайд №30 Polymorphism. Создание проекта, слайд №31 Polymorphism. Создание проекта, слайд №32 Polymorphism. Создание проекта, слайд №33 Polymorphism. Создание проекта, слайд №34 Polymorphism. Создание проекта, слайд №35 Polymorphism. Создание проекта, слайд №36 Polymorphism. Создание проекта, слайд №37 Polymorphism. Создание проекта, слайд №38 Polymorphism. Создание проекта, слайд №39 Polymorphism. Создание проекта, слайд №40 Polymorphism. Создание проекта, слайд №41 Polymorphism. Создание проекта, слайд №42 Polymorphism. Создание проекта, слайд №43 Polymorphism. Создание проекта, слайд №44 Polymorphism. Создание проекта, слайд №45 Polymorphism. Создание проекта, слайд №46 Polymorphism. Создание проекта, слайд №47

Содержание

Вы можете ознакомиться и скачать презентацию на тему Polymorphism. Создание проекта. Доклад-сообщение содержит 47 слайдов. Презентации для любого класса можно скачать бесплатно. Если материал и наш сайт презентаций Mypresentation Вам понравились – поделитесь им с друзьями с помощью социальных кнопок и добавьте в закладки в своем браузере.

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


Слайд 1


Polymorphism
Описание слайда:
Polymorphism

Слайд 2


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

Слайд 3


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

Слайд 4


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

Слайд 5


Добавляем cpp-файл
Описание слайда:
Добавляем cpp-файл

Слайд 6


Транспортные средства
Описание слайда:
Транспортные средства

Слайд 7


Работа примера Каждый класс, отнаследованный от Transport, получает метод Drive. (т.е., наследники обладают общим интерфейсом). Однако, каждое...
Описание слайда:
Работа примера Каждый класс, отнаследованный от 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


Доверяй, но проверяй Итак, попробуем применить новые знания на практике:
Описание слайда:
Доверяй, но проверяй Итак, попробуем применить новые знания на практике:

Слайд 15


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

Слайд 16


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

Слайд 17


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

Слайд 18


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

Слайд 19


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

Слайд 20


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

Слайд 21


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

Слайд 22


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

Слайд 23


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

Слайд 24


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

Слайд 25


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

Слайд 26


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

Слайд 27


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

Слайд 28


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

Слайд 29


Как это всё работает? Для начала, рассмотрим пример: Пример демонстрирует, как можно получить адреса объектов, их полей и методов.
Описание слайда:
Как это всё работает? Для начала, рассмотрим пример: Пример демонстрирует, как можно получить адреса объектов, их полей и методов.

Слайд 30


Добавим наследование Теперь примерно то же самое, но с наследованием:
Описание слайда:
Добавим наследование Теперь примерно то же самое, но с наследованием:

Слайд 31


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

Слайд 32


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

Слайд 33


Скрин отладчика
Описание слайда:
Скрин отладчика

Слайд 34


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

Слайд 35


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

Слайд 36


Пример Почитать дома:
Описание слайда:
Пример Почитать дома:

Слайд 37


UML-диаграмма
Описание слайда:
UML-диаграмма

Слайд 38


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

Слайд 39


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

Слайд 40


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

Слайд 41


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

Слайд 42


overload vs override
Описание слайда:
overload vs override

Слайд 43


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

Слайд 44


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

Слайд 45


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

Слайд 46


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

Слайд 47


RTTI Оператор instanceof относится к механизму динамической идентификации типа данных (run-time type information, run-time type identification),...
Описание слайда:
RTTI Оператор instanceof относится к механизму динамической идентификации типа данных (run-time type information, run-time type identification), который позволяет определить тип данных объекта во время выполнения программы.



Похожие презентации
Mypresentation.ru
Загрузить презентацию