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

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

Содержание

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

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


Слайд 1





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

Слайд 2





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

Слайд 3





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

Слайд 4





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

Слайд 5





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

Слайд 6





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

Слайд 7





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

Слайд 8





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

Слайд 9





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

Слайд 10





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

Слайд 11





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

Слайд 12





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

Слайд 13





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

Слайд 14





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

Слайд 15





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

Слайд 16





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

Слайд 17





Правило виртуальности
Получается, что наличие в коде ключевого слова virtual решило все проблемы по работе с разнотипными объектами! Существует правило виртуальности: метод, объявленный виртуальным в некотором классе, остаётся таким во всех классах-потомках. Но для наглядности в C++ рекомендуется писать ключевое слово 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 полиморфизм. Реализуется через механизм перегрузки методов – эта тема вам уже хорошо знакома.
Параметрический полиморфизм. Реализуется через механизм обобщений (generics, дженериков) – с этим будем разбираться после темы «интерфейсы».
Описание слайда:
Статический полиморфизм Ad-hoc полиморфизм. Реализуется через механизм перегрузки методов – эта тема вам уже хорошо знакома. Параметрический полиморфизм. Реализуется через механизм обобщений (generics, дженериков) – с этим будем разбираться после темы «интерфейсы».

Слайд 25





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

Слайд 26





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

Слайд 27





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

Слайд 28





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

Слайд 29





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

Слайд 30





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

Слайд 31





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

Слайд 32





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

Слайд 33





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

Слайд 34





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

Слайд 35





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

Слайд 36





Пример
https://git.io/vr16A
Почитать дома:
https://habrahabr.ru/post/51229/
https://en.wikipedia.org/wiki/Virtual_method_table
Описание слайда:
Пример https://git.io/vr16A Почитать дома: https://habrahabr.ru/post/51229/ https://en.wikipedia.org/wiki/Virtual_method_table

Слайд 37





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

Слайд 38





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

Слайд 39





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

Слайд 40





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

Слайд 41





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

Слайд 42





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

Слайд 43





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

Слайд 44





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

Слайд 45





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

Слайд 46





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

Слайд 47





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
Описание слайда:
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



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