bayanruby
@bayanruby
PHP Developer

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

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();

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

Декларацию переменной действительно можно заменить на метод, который принимает экземпляр A и всех его дочерних классов: для наглядности так будет лучше, но в остальном отличий мало. (Мой код на TypeScript, но его смысл понятен, думаю.)
class A {
    someMethod(): string {
        return "A";
    }
}

class B extends A {
    someMethod(): string {
        return "B";
    }
}

function callSomeMethod(object: A) {
    console.log(object.someMethod());
}

callSomeMethod(new A()); // "A"
callSomeMethod(new B()); // "B"


Можно обойтись и без функции, если явно указать тип переменной (и если PHP так позволяет):
const objectWithSomeMethod: A = new B();
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы