Содержимое
ООП. Полиморфизм Продолжаем серию постов с ликбезом по ООП. Кто присоединился недавно и хочет разобраться с тем, что такое объектно-ориентированное программирование, советую начать с предыдущих постов: 1. Что такое классы 2. Что такое объекты классов и как их создавать. Конструкторы 3. Что такое ООП 4. Принципы ООП: абстракция. Инкапсуляция 5. Принципы ООП: наследование 6. Абстрактные классы. Интерфейсы Сегодня рассмотрим азы такого принципа ООП, как полиморфизм. Полиморфизм означает возможность использовать для одних и тех же целей объекты разных типов (например, разных классов). Возьмём для примера снова телевизор. Телевизор - это объект класса TVSet. Нам нужно запрограммировать его так, чтобы им можно было управлять с помощью пульта. Если не использовать полиморфизм, то мы разрешаем классу TVSet взаимодействовать ТОЛЬКО с классом пульт (назовем его Remote) - и никак по-другому включить и выключить телевизор, кроме как определенным, специально для него созданным пультом мы не сможем. Для подключения к современным телевизорам можно использовать не только пульт той же фирмы, но и, например, смартфон - поставить на него приложение «пульт» или приложение «умный дом» с функцией управления телевизором - и использовать его вместо пульта. Таким образом, нам не нужно жёстко привязывать именно класс Remote к классу TVSet. Мы можем запрограммировать телевизор так, чтобы он работал с любым классом, если этот класс поддерживает интерфейс (про интерфейсы читайте предыдущий пост из цикла) - такой же интерфейс, как у пульта к телевизору. То есть класс должен уметь делать turnOn, turnOff, переключать каналы, менять громкость - и этого достаточно, чтобы он подходил к телевизору. Это и есть пример полиморфизма. Когда мы определяем функцию или метод в строготипизированном языке, мы можем потребовать, чтобы в аргументе был объект строго определенного класса (например, пульт): function turnOnTV(Remote remote) { … } А можем зайдествовать полиморфизм, и сказать функции, чтобы она принимала любой объект, у которого реализован интерфейс (назовем этот интерфейс IRemotable): function turnOnTV(IRemotable remote) { … } И тут мы передаем в нее любой объект с подходящим интерфейсом, не только пульт. А как конкретно полиморфизм использовать в разных языках программирования - зависит от их синтаксиса и возможностей.