#php #ооп #полиморфизм
Всем привет! Помогите понять полиморфизм правильно. Так как примеров в Интернете много и все они отличаются друг от друга. Как я его понимаю. Это когда свойство базового класса может использовать методы производных классов. Часто встречаю в Интернет два примера полиморфизма Пример 1. class user { public $type = 'default_user'; public function setName (){ } public function Call (){ return $this->setName(); } } class admin extends user { public function setName (){ return $this->type = "admin"; } } class superUsers extends user { public function setName (){ return $this->type = "superUser"; } } $super = new superUsers; $admin = new admin; echo $super->call(); echo $admin->call(); Пример 2. class user { public $type = 'default_user'; public function setName (){ } } class admin extends user { public function setName (){ return $this->type = "admin"; } } class superUsers extends user { public function setName (){ return $this->type = "superUser"; } } $super = new superUsers; $admin = new admin; echo $super->setName(); echo $admin->setName(); Так как я понял и в первом примере и во втором примере показан полиморфизм , а называется этот вид override.
Ответы
Ответ 1
Стоит начать с того, что полиморфизм бывает разный. В ООП полиморфизмом чаще всего называют способность классов с одинаковой спецификацией(интерфейсом) определять различную реализацию, что, в свою очередь, позволяет клиентскому коду абстрагироваться от этой самой реализации и работать с классом, исходя из его спецификации. Например, ваш метод может ожидать получить на входе объект типа UserInterface, при этом не зная, с каким конкретным подтипом типа UserInterface он будет работать. Таким образом вы можете единообразно обрабатывать различные типы данных, полагаясь на то, что каждый входной параметр соответствует спецификации UserInterface. При этом, в некоторых ООП языках используется т.н. "утиная типизация". Она же неявная типизация. Это когда клиентский код ожидает, что у используемого им объекта определен некоторый метод. Это позволяет использовать полиморфизм для обработки объектов, которые даже не обязательно входят в иерархию наследования. Например, если я напишу функцию: function ($object) { echo $object->setName(); } Она сможет корректно работать как с вашими наследниками от user, так и с любым другим объектом, у которого можно вызвать метод setName без параметров, который возвращал бы строку. Например: class DefinitelyNotAUser { public function setName() { return 'haduken!'; } } Анонимная функция описаная выше сможет работать с экземплярами этого класса точно так же как и с вашими наследниками от user. Это называется сигнатурным полиморфизмом. Такой подход широко распространен в Ruby, в PHP я бы не рекоммендовал его использовать. Функция реализованная для произвольного типа данных также будет примером полиморфизма (параметрического). Например: function handler($object, callable $action) { return $action($object); } $result = handler(new admin(), function ($object) { echo $object->setName(); }); Стоит заметить, что полиморфизм не яляется чем-то свойственным исключительно объектно-ориентированной парадигме. Полиморфизм присутствует и в функциональной, и в процедурной парадигме. Параметрический полиморфизм функции описаной для произвольного типа данных - пример для ФП. Вызов конкретной реализации функции в зависимости от типов переданных параметров - пример полиморфизма для процедурного программирования. Главное проявление полиморфизма - позднее связывание вызываемого кода с вызывающим, когда среда запуска умеет определять, какая именно вызывается реализация, исходя из контекста исполнения программы. Самое простое определение полиморфизма, которое вам сейчас необходимо запомнить, учитывая, что в тэгах к вопросу стоят PHP и ООП: "Один интерфейс - много реализаций". Что неправильно в вашем текущем понимании: вы зацикленны на отношениях базового и производных классов. Полиморфизм не об этом. Он о вызывающем (клиентском) коде и вызываемом, а также об их динамическом соответствии.
Комментариев нет:
Отправить комментарий