Полиморфизм (Duck typing)
Полиморфизм
Полиморфизм - это возможность обращаться к различным объектам по их общему принципу. Возможно звучит сложно, но давайте посмотрим на пример использования.
Возможно может показаться, что это сработало благодаря наследованию, но на самом деле наследование здесь никакой роли не играет. И тот и другой класс имеют метод с одинаковым названием voice
. Метод animal_voice
не имеет никакой информации какой объект будет ему передан. Мы лишь знаем, что у этого объекта должен быть метод voice
. Если вы уберете наследование и попробуете запустить код, то ничего не поменяется.
Duck typing
Почему это называют duck typing ? Дословно это переводится как "Утиная типизация", которая гласит: если объект выглядит как утка и может делать тоже самое, что и утка, значит мы можем быть уверены, что это утка. На самом деле с самой уткой тут ничего общего нет, поэтому вместо слово утки можете подставить любое название.
Итоги
Очень часто можно встретить полиморфизм в строго типизированных компилируемых языках, так как в них реализация полиморфизма проходит более явно за счет интерфейсов. а также присутсвуют ограничения на уровне компиляции. Но на самом деле это всего лишь реализация такого подхода. В Ruby нам не нужно даже наследоваться от родителя для того, чтобы использовать два разных объекта, если у них есть общий признак.
И еще раз, полиморфизмом не является то, что мы можем у аргумента метода вызывать метод с одинаковым назывнием. Полиморфизм это возвожность работать с объектами разных классов по общему признаку.
Задание animals
Внимание ! Это и последующие задания данного модуля с названием animals
необходимо выполнять в одной и той же директории в корне модуля - 3_oop/animals
перенесите вашу логику перекормления до смерти и замяукивания до смерти в отдельные методы,
def meow_until_death(animal)
иdef eat_until_death(animal)
соответственно, которые будут принимать объект кота в аргументах.вызовите эти методы для разных котов
Создайте несколько экземпляров класса
Dog
. Попробуйте применить ваши методы на объектах класса собаки.Убедитесь, что метод работает исправно для собаки и для кота
Какое поведение вы наблюдаете ?
Задание company
Внимание ! Это и последующие задания данного модуля с названием company
необходимо выполнять в одной и той же директории в корне модуля - 3_oop/company
Создайте класс компании
Company
, содержащей сотрудников и реализующей методы:hire(employee)
- найм одного сотрудника. В аргументах метод ожидает получить объект на базе класса сотрудника.hireAll(employes)
- найм списка сотрудников. В аргументах метод ожидает получить массив объектов на базе классов сотрудника.fire(employee)
- увольнение сотрудника. В аргументах метод ожидает получить объект классаEmployee
Создайте классы сотрудников
Manager
,TopManager
иOperator
с методом получения информациии о зарплатеget_salary
и условиями начисления зарплаты:Manager
— зарплата складывается из фиксированной части и бонуса в виде 5% от заработанных для компании денег. Количество заработанных денег для компании генерируйте случайным образом от 115 000 до 140 000 рублей в момент установления заработной платы.TopManager
— зарплата складывается из фиксированной части и бонуса в виде 150% от заработной платы, если доход компании более 10 млн рублей.Operator
— зарплата складывается только из фиксированной части.
Рекомендации:
Чтобы получить данные компании внутри класса сотрудника, настройте хранение ссылки на Company и передавайте объект Company с помощью конструктора.
Сделайте возможным создание разных экземпляров компании со своим списком сотрудников и доходов.
Данное задание творческое. Многие ньюансы и подробности были специально опущены, чтобы вы могли сами придумать как та или иная функциональность будет работать.
Дополнительный материал
Last updated