Страницы

Поиск по вопросам

суббота, 4 января 2020 г.

Правильно понять полиморфизм

#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 и ООП: "Один интерфейс - много реализаций". Что неправильно в вашем текущем понимании: вы зацикленны на отношениях базового и производных классов. Полиморфизм не об этом. Он о вызывающем (клиентском) коде и вызываемом, а также об их динамическом соответствии.

Комментариев нет:

Отправить комментарий