Отличия абстрактного класса от интерфейса

В чем же разница между Абстрактным классом и Интерфейсом?
Отличия будут приведены в контексте Php:

Создание

А:

abstract class PC{}

И:

interface Portable{}

Пример использования

А:

abstract class PC
{
    protected $info;
	public function getInfo(){
		return $this->info;
	}
}
class Desktop extends PC{}

И:

interface Portable{
   public function move();
}

class Laptop implements Portable{
	public function move(){
		//обязательно код метода
	}
}

Цель использования

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

Абстрактный класс(сущность): PersonalComputer
Наследники: Desktop, Laptop, Tablet

Абстрактный класс(сущность): Chair
Наследники: WoodChair, IronChair, PlasticChair

И:
Как правило описывает возможности, свойства, поведение.

Содержимое

А:
Может иметь методы и данные.
Методы могут как иметь, так и не иметь реализацию. Наследник может реализовать данный метод, а может и не реализовывать, но если метод объявлен как абстрактный, то наследник обязан иметь реализацию этого метода.
Могут иметь статичные методы (static).
Может иметь конструктор для потомков

Модификаторы доступа для методов и данных класса могут быть: public, protected, private. Абстрактные методы могут быть только public либо protected.

abstract class PC
{
    protected $ram;
	public $cpu;
	
	public function getCpu(){
		return $this->cpu;
	}
}

И:
Может иметь только методы без реализации. Модификаторы доступа только — public!
Использование protected либо private для методов приведет к ошибке.
Могут иметь статичные методы (static).

Наследование

А:
Класс может быть унаследован только от одного абстрактного класса.

class Desktop extends PC{}

И:
Класс может иметь реализацию(implements) нескольких интерфейсов

class Laptop implements Portable, TouchScreenable, Gameable

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

Класс может не реализовывать все методы интерфейса только если он является абстрактным.

Экземпляры абстрактного класса и интерфейса

Абстрактный класс и Интерфейс не могут иметь экземпляров, т.е. нельзя сделать так:

$pc = new PC();

и так:

$pc = new Portable();

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

ПоделитьсяShare on Facebook0Share on VKShare on Google+0Tweet about this on TwitterShare on LinkedIn0Pin on Pinterest0

Добавить комментарий