Разница между абстракцией классов и объектными интерфейсами в PHP? - PullRequest
7 голосов
/ 11 июня 2010

В чем разница между абстракцией класса и объектными интерфейсами в 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);
}

Ответы [ 3 ]

20 голосов
/ 11 июня 2010

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

Возможно:

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 :

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

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

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

3 голосов
/ 11 июня 2010

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

0 голосов
/ 11 июня 2010

Несколько интерфейсов плюс ваши скрипты не наталкиваются на родительскую путаницу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...