методы — что такое использование публичной функции с телом в абстрактном классе php?

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

<?php
//declare abstract class
abstract class Test {

// declare method 1 with body
public function method1()
{
echo "hello"; //what is use of this code here
}

public function method2()
{
$this->method3();
}

abstract public function method3();
}

//extended abstract class to another class
class AnotherTest extends Test{

public function method1(){
echo "5+9"/2;
}

public function method3(){
echo 2+9;
}

public function method2()
{
echo "just for testing";
}
}

$obj = new AnotherTest();

$obj->method1();
echo nl2br("\n");
$obj->method3(9,10);
echo nl2br("\n");
$obj->method2();
?>

-1

Решение

Вообще говоря, вы бы не нормально override каждый абстрактный метод. Если это так, то вы делаете что-то не так и нуждаетесь в рефакторинге.

Кроме того, наличие абстрактного (или любого расширенного класса) дает вам возможность вызывать parent::function() что позволит запустить метод родителей, тогда вы можете сделать ваши текущие классы дополнительной логикой.

В конце концов, это является основой для Polymorphism Простое объяснение: дочерний класс может расширять родительский класс, но действовать по-другому, изменяя поведение методов.

Прямо ваши «тесты» — просто плохие примеры, потому что в этих случаях вы правы, абстрактные тела почти бессмысленны.

0

Другие решения

Написание тела метода для метода базового класса обеспечивает поведение по умолчанию для этого метода на любых подклассах, которые не переопределяют метод.

Для любого (неfinal) public или же protected Метод базового класса вы можете сделать одним из следующих:

  • Примите это поведение по умолчанию без изменений, не определяя метод с тем же именем в подклассе
  • Переопределите и перенесите это поведение, определив новый метод с тем же именем, которое вызывает parent::methodName() в подклассе
  • Переопределите и замените это поведение, определив новый метод с тем же именем, которое НЕ вызывает parent::methodName() в подклассе

Основное преимущество кода, написанного таким образом, заключается в том, что он использует преимущества Полиморфизм отправлять вызовы универсальных методов для конкретных реализаций. Определение тела метода вместо того, чтобы оставлять его абстрактным, просто обеспечивает поведение по умолчанию. Поскольку это очень абстрактная концепция объектно-ориентированного программирования, сложно создать пример, который был бы простым и не тривиальным. Лучше всего взглянуть на популярные кодовые базы, такие как Laravel Framework или один из различных Компоненты Symfony для примеров этой концепции в действии.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector