Различие между абстракцией класса и интерфейсами объекта в PHP?

Каково различие между Абстракцией Класса и Интерфейсы объекта в PHP? Я спрашиваю, потому что, я действительно не вижу точку им обоим, они оба делают то же самое! Так, что преимущества недостатков используют обоих против одного или другого?

Абстракция класса:

abstract class aClass
{
    // Force extending class to define these methods
    abstract public function setVariable($name, $var);
    abstract public function getHtml($template);
}

Интерфейс объекта:

interface iClass
{
    // Force impementing class to define these methods
    public function setVariable($name, $var);
    public function getHtml($template);
}

7
задан Charles 24 December 2012 в 21:18
поделиться

3 ответа

Вы можете реализовать несколько интерфейсов, но расширить только один класс.

Возможно:

class MyClass extends MyAbstract implements MyInterface1, MyInterface2, MyInterface3 {  }

Невозможно:

class MyClass extends MyAbstract1, MyAbstract2 implements MyInterface {  }

Кроме того, интерфейс не может иметь реализацию.

Возможно:

abstract class MyClass {
    function doSomething() {
        echo "I can give this method an implementation as this is an abstract class";
    }
}

Невозможно:

interface MyClass {
    function doSomething() {
        echo "I can NOT give this method an implementation as this is an interface";
    }
}

Из Java Glossary:

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

Абстрактный класс, напротив, обеспечивает большую структуру. Он обычно определяет некоторые реализации по умолчанию и предоставляет некоторые инструменты, полезные для полной реализации. Загвоздка в том, что код, использующий его, должен использовать ваш класс в качестве базового. Это может быть очень неудобно, если другие программисты, желающие использовать ваш пакет, уже разработали свою собственную иерархию классов. В Java класс может наследоваться только от одного базового класса.

Вам также стоит взглянуть на этот вопрос - замечание Дэмиена о том, что интерфейс - это контракт, очень важно.

20
ответ дан 6 December 2019 в 07:50
поделиться

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

3
ответ дан 6 December 2019 в 07:50
поделиться

Множество интерфейсов плюс ваши скрипты не вызывают никаких проблем с родителями.

0
ответ дан 6 December 2019 в 07:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: