Каким видом полиморфизма является этот код?

class A {
    public function method1() {
        return $this->method2();
    }

    protected function method2() {
        return 'A';
    }
}

class B extends A {
    protected function method2() {
        return 'B';
    }
}

$b = new B();
echo $b->method1();

Нашел такой код на одном сайте, там пишут, что это полиморфизм. Но где тут полиморфизм? Я вижу тут переопределение метода и все. Чтобы был полиморфизм подтипов (включения), здесь не хватает функции, которая будет в аргументах принимать подтипы базового класса А. Верно же?


Ответы (1 шт):

Автор решения: Андрей Туманов

В приведенном примере НЕТ полиморфизма. Это пример наследования.

Полиморфизм, это когда с использованием переменной базового класса выполняются действия объекта, созданного на основе класса-потомка.

Если бы в примере была сделана типизация переменной $b по типу A и вызывался бы метод method2 (для этого он должен быть публичным), тогда был бы полиморфизм.

Можно подумать, что в операторе

$this->method2();

в методе method1() класса A случается полиморфизм.

Но это не "чистый" пример полиморфизма. Так как метод используется изнутри самого базового класса. Это, скорее, пример абстракции.

→ Ссылка