Field note
Чем отличается абстрактный класс от интерфейса ?
Чем отличается абстрактный класс от интерфейса ? Спросят с вероятностью 60%
Абстрактный класс и интерфейс - это два механизма, которые используются для достижения абстракции в ООП, но каждый из них играет свою роль и имеет свои особенности.
Абстрактный класс - не может быть инстанциирован (то есть, вы не можете создать объект этого класса напрямую). Он предназначен для того, чтобы служить базовым классом для других классов. Могут содержать как абстрактные методы (без реализации), так и методы с полной реализацией. Классы, наследующие его, должны реализовать все его абстрактные методы, но могут также переопределять реализованные методы.
Интерфейс представляет собой полностью абстрактный класс, который содержит только абстрактные методы (без реализации) и константы. Используются для определения набора методов, которые класс должен реализовать, не определяя при этом логику выполнения этих методов. Один класс может реализовывать множество интерфейсов, что позволяет обеспечить большую гибкость и множественное наследование.
Основные различия:
1️⃣Наследование vs. Реализация: Классы наследуют абстрактный класс (extends), но реализуют интерфейс (implements).
2️⃣Методы и свойства: Абстрактные классы могут содержать как абстрактные, так и неабстрактные методы и свойства, в то время как интерфейсы могут содержать только абстрактные методы и константы.
3️⃣Множественное наследование: Класс не может наследовать более одного абстрактного класса, но может реализовывать множество интерфейсов.
4️⃣Конструкторы: Абстрактные классы могут иметь конструкторы, в то время как интерфейсы не могут.
Абстрактный класс:
abstract class Животное {
public function дышать() {
echo "Дышит воздухом";
}
abstract public function издаватьЗвук();
}
class Собака extends Животное {
public function издаватьЗвук() {
echo "Гав";
}
}Интерфейс:
interface Передвигается {
public function двигаться();
}
class Человек implements Передвигается {
public function двигаться() {
echo "Ходит на двух ногах";
}
}Абстрактный класс используется для определения общего поведения наследников, в то время как интерфейс определяет набор методов, которые должен реализовать класс. Абстрактный класс может быть использован для определения основы, а интерфейсы - для обеспечения гибкой архитектуры через множественное наследование.