oop — Когда мы должны использовать абстрактную функцию или нормальную функцию в базовом классе в PHP?

Итак, у меня есть вопрос о разнице между «когда мы должны объявить нормальную функцию» а также «когда мы должны объявить абстрактную функцию» в базовом классе. Посмотри на мой пример.

В абстрактном классе:

abstract class Birds {
abstract public function fly();
}

class Swallow extends Birds {
public function fly() {
// This function override fly function in Birds class
echo "Implement fly function in Swallow class";
}
}

В обычном классе:

class Birds {
public function fly() {
echo "Implement fly function in Birds class";
}
}

class Swallow extends Birds {
public function fly() {
// This function override fly function in Birds class
echo "Implement fly function in Swallow class";
}
}

Что вы можете увидеть. Функция fly в классе Swallow наследуется классом Birds (во всех случаях). Это одно и то же. Так что я смущен, и я не знаю, когда мы должны объявить абстрактную функцию в базовом классе?

Спасибо за вашу помощь!

1

Решение

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

//abstract class
abstract class Birds {
abstract public function fly();
}
//interface
interface Birds {
public function fly();
}

Это потому, что абстрактные методы имеют ту же цель, что и метод интерфейса. Когда вы где-то еще создаете функцию (или метод, или класс, или другой интерфейс и т. Д.), И вам потребуется Birds Например, вы будете уверены, что этот абстрактный метод доступен, хотя он не был реализован в Birds,

public function sendBirdToSpace(Birds $bird) { //no matter what Bird subclass
$bird->fly(); //you're sure this method is avaiable
}

Также обычно у вас будет более одного дочернего класса. Когда дело доходит до этого, становится все яснее об абстрактном методе.

Это на самом деле довольно просто. Должен Birds иметь реализацию поведения по умолчанию flyING? Это все. Если каждая птица может летать, но нет способа по умолчанию — сделайте его абстрактным.

3

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

Взято из PHP ООП Класс Абстракция:

При наследовании от абстрактного класса все методы помечаются как абстрактные в
объявление класса родителя должно быть определено ребенком;
Кроме того, эти методы должны быть определены с тем же (или менее
ограничено) видимость Например, если задан абстрактный метод
как защищенная реализация функции должна быть определена как
защищенный или публичный, но не частный.

По сути, это говорит о том, что ваш Swallow учебный класс имеет наследовать (иметь) fly() метод в нем, если он расширяет Bird класс основан на его abstract определение.

Общее правило при использовании abstract методы это когда вы хотите нормальности среди классов.

Возьмем, к примеру, следующее:

Class Car {

abstract public function make();
abstract public function model();
}

Это наш «базовый» класс. Все, что выходит из этого имеет в указать make() & model() методы.

Class Tesla extends Car {

public function make() {}

public function mmodel() {}
}

Как вы видите выше, наши Tesla класс имеет необходимые методы внутри. Если вы не включите эти методы, вы получите ошибки PHP.


Заметка

Если вы изучаете эту опцию «контейнерной» разработки, я бы посоветовал вам PHP ООП Объектные Интерфейсы тоже того стоит!

3