Практика: Полиморфизм в PHP.
В разделе "Абстрактные классы и методы PHP" мы узнали, что лучше давать одно и то же имя методам, которые делают похожие вещи в разных классах.
В этом практическом занятии мы сможем попрактиковаться в том, что узнали о принципах полиформизма, ответив на некоторые вопросы и написав собственный код.
Принцип полиморфизма в PHP
Какое из этих предложений лучше всего определяет принцип полиморфизма в PHP?
- A Методы, которые выполняют одинаковые функции в разных классах, должны иметь одно и то же имя.
- B Одна и та же функция может иметь много имен.
- C Греческий термин для обозначения наследования.
- D Может быть реализован на большинстве современных языков программирования.
AВ соответствии с принципами полиморфизма методы, выполняющие одинаковые функции в разных классах, должны иметь одно и то же имя.
Блокнот, чтобы попрактиковаться в кодировании *Этот код не сохраняется и никуда не отправляется*
<?php
//Ваш код
Упражнение по кодированию
В этом упражнении вернемся к классу User, который мы использовали в предыдущих заданиях.
Чтобы реализовать принцип полиморфизма, мы собираемся создать абстрактный класс User, который фиксирует классы, унаследованные от него, для расчета количества баллов, которые имеет пользователь, в зависимости от количества статей, которые он написал или отредактировал. На основе класса User мы создадим классы Author и Editor и оба будут вычислять количество баллов с помощью метода calcScores(), хотя вычисленное значение будет отличаться между двумя классами.
Это пример абстрактного класса User:
abstract class User {
protected $scores = 0;
protected $numberOfArticles = 0;
// Абстрактные и конкретные методы
}
Добавьте к классу User конкретные методы для задания и получения количества статей:
1. setNumberOfArticles($int)
2. getNumberOfArticles()
$int означает целое число.
abstract class User {
protected $scores = 0;
protected $numberOfArticles = 0;
public function setNumberOfArticles($int)
{
// Привести к целочисленному типу
$numberOfArticles = (int)$int;
$this -> numberOfArticles = $numberOfArticles;
}
public function getNumberOfArticles()
{
return $this -> numberOfArticles;
}
}
Блокнот, чтобы попрактиковаться в кодировании *Этот код не сохраняется и никуда не отправляется*
<?php
//Ваш код
Добавьте в класс абстрактный метод: calcScores(), который выполняет вычисление баллов отдельно для каждого класса.
abstract class User {
protected $scores = 0;
protected $numberOfArticles = 0;
public function setNumberOfArticles($int)
{
// Привести к целочисленному типу
$numberOfArticles = (int)$int;
$this -> numberOfArticles = $numberOfArticles;
}
public function getNumberOfArticles()
{
return $this -> numberOfArticles;
}
// абстрактный метод
abstract public function calcScores();
}
Блокнот, чтобы попрактиковаться в кодировании *Этот код не сохраняется и никуда не отправляется*
<?php
//Ваш код
Создайте класс Author, который наследуется от класса User. В классе Author создайте конкретный метод calcScores(), который возвращает количество баллов из следующего расчета:
numberOfArticles * 10 + 20
class Author extends User {
public function calcScores()
{
return $this -> scores = $this -> numberOfArticles * 10 + 20;
}
}
Блокнот, чтобы попрактиковаться в кодировании *Этот код не сохраняется и никуда не отправляется*
<?php
//Ваш код
Также создайте класс Editor, который наследуется от класса User. В классе Editor создайте конкретный метод calcScores(), который возвращает количество баллов из следующего расчета:
numberOfArticles * 6 + 15
class Editor extends User {
public function calcScores()
{
return $this -> scores = $this -> numberOfArticles * 6 + 15;
}
}
Блокнот, чтобы попрактиковаться в кодировании *Этот код не сохраняется и никуда не отправляется*
<?php
//Ваш код
Создайте объект $author1 из класса Author, установите количество статей равное 8 и повторите подсчёт баллов, полученных автором.
Ожидаемый результат:
100
$author1 = new Author();
$author1 -> setNumberOfArticles(8);
echo $author1 -> calcScores();
Блокнот, чтобы попрактиковаться в кодировании *Этот код не сохраняется и никуда не отправляется*
<?php
//Ваш код
Создайте другой объект $editor1 из класса Editor, установите количество статей равным 15 и повторите оценки, полученные редактором.
Ожидаемый результат:
100
105
$editor1 = new Editor();
$editor1 -> setNumberOfArticles(15);
echo $editor1 -> calcScores();
Блокнот, чтобы попрактиковаться в кодировании *Этот код не сохраняется и никуда не отправляется*
<?php
//Ваш код