exam12 3 - stankin/design-part-2 GitHub Wiki
Понятие полиморфизма в объектно-ориентированном подходе, особенности использования полиморфизма на уровне экземпляров класса.
Реферат к лекции 12 Моделирование данных
Выполнил: Глущенко Дмитрий, группа ИДБ-18-06
Проверил: Саркисьянц Григорий, группа ИДБ-18-06
Объектно-ориентированное программирование (ООП) — методология программирования, основанная на представлении программы в виде совокупности взаимодействующих объектов, каждый из которых является экземпляром определённого класса, а классы образуют иерархию наследования.
Идеологически ООП — подход к программированию как к моделированию информационных объектов, решающий на новом уровне основную задачу структурного программирования: структурирование информации с точки зрения управляемости, что существенно улучшает управляемость самим процессом моделирования, что, в свою очередь, особенно важно при реализации крупных проектов.
Управляемость для иерархических систем предполагает минимизацию избыточности данных и их целостность, поэтому созданное удобно управляемым — будет и удобно пониматься. Таким образом, через тактическую задачу управляемости решается стратегическая задача — транслировать понимание задачи программистом в наиболее удобную для дальнейшего использования форму.
Основные принципы структурирования в случае ООП связаны с различными аспектами базового понимания предметной задачи, которое требуется для оптимального управления соответствующей моделью:
- абстракция для выделения в моделируемом предмете важного для решения конкретной задачи по предмету, в конечном счёте — контекстное понимание предмета, формализуемое в виде класса;
- инкапсуляция для быстрой и безопасной организации собственно иерархической управляемости: чтобы было достаточно простой команды «что делать», без одновременного уточнения как именно делать, так как это уже другой уровень управления;
- наследование для быстрой и безопасной организации родственных понятий: чтобы было достаточно на каждом иерархическом шаге учитывать только изменения, не дублируя всё остальное, учтённое на предыдущих шагах;
- полиморфизм для определения точки, в которой единое управление лучше распараллелить или наоборот — собрать воедино.
С низкоуровневой точки зрения полиморфизм - это все, что во время компиляции или исполнения программы может содержать или обрабатывать значения различных типов — является полиморфным, например:
- переменные, меняющие свое значение на значение другого типа;
- объекты, обладающие свойствами, которые могут менять значение текущего типа на значение другого типа;
- функции, принимающие аргументы различных типов.
С высокоуровневой точки зрения, в ООП, полиморфизм - способность функции обрабатывать данные разных типов.
Примеры использования и инструменты полиморфизма в различных языках:
- Шаблоны C++
- Генерики TypeScript
- Перегрузка C++
- Наследование в ООП, с последующей перегрузкой методов
- Абстрактные классы и интерфейсы
В некоторых языках, которые имеют не строгое типизированные типы, полиморфизм повсеместен и может использоваться неявно:
- JavaScript
- PHP
- Visual Basic
В рамках этого вопроса полиморфизм можно определить более абстрактно – это способность программы идентично использовать объекты с одинаковым интерфейсом без информации о конкретном типе этого объекта.
Язык программирования поддерживает полиморфизм на уровне экземпляров класса, если классы с одинаковой спецификацией могут иметь различную реализацию.
Пример использования полиморфизма в ООП на уровне экземпляров класса ярче всего можно наблюдать в JavaScript в комбинации с HTML:
HTML, в которой присутствует только два блока div с id:
< div id='button1'>Кнопка</div> < div id='button2'>Кнопка2</div>
Сейчас блоки является объектами, со стандартным поведением (рендеринг), но при помощи JS можно изменить поведение объекта благодаря полиморфизму в экземпляра класса:
JS, в котором мы добавляем реакцию первого блока на нажатие на него:
button1.onClick = () => { alert(На первый блок нажали); }
Теперь объект блока div с id button1 ведет себя по другому, так как он теперь еще и реагирует на нажатие, после которого будет выведено сообщение "На кнопку нажали", в то время как второй блок остался со стандартным поведением.
Таким образом, особенность использования полиморфизма на уровне экземпляров класса дает нам возможность изменения поведения объектов класса независимо от других экземпляров этого класса, что позволяет очень гибко настраивать их реакцию (поведение) на вызов различных методов.