2010-08-26 5 views
4

Можно создать дубликат:
PHP: What is the difference between an interface and abstract class?В чем разница между абстрактным и интерфейсом в php?

привет ребята ..

Насколько я понимаю, а Clase реализует или расширяет абстрактный или интерфейс класса должен использовать стандартные методы. Я знаю, что мы можем использовать ключевое слово реализации для использования нескольких интерфейсов, но мы можем расширить только 1 абстрактный. Может ли кто-нибудь объяснить, какой из них использовать в реальной жизни и разницу? Бесконечно благодарен!!!!

+3

Duplicate: http://stackoverflow.com/questions/1913098/php-what-is-the-difference-between-an-interface-and-abstract-class – shamittomar

+0

вопрос может быть обобщен, возможно ... :) – ultrajohn

ответ

11

Различия как теоретические, так и практические:

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

Пример - интерфейс:

// define what any class implementing this must be capable of 
interface IRetrieveData { 
    // retrieve the resource 
    function fetch($url); 

    // get the result of the retrieval (true on success, false otherwise) 
    function getOperationResult(); 

    // what is this class called? 
    function getMyClassName(); 
} 

Теперь у нас есть набор требований, которые будут проверены для каждого класса, реализующего это. Давайте создадим абстрактный класс и его дети:

// define default behavior for the children of this class 
abstract class AbstractRetriever implements IRetrieveData { 
    protected $result = false; 

    // define here, so we don't need to define this in every implementation 
    function getResult() { 
     return $result; 
    } 

    // note we're not implementing the other two methods, 
    // as this will be very different for each class. 
} 

class CurlRetriever extends AbstractRetriever { 
    function fetch($url) { 
     // (setup, config etc...) 
     $out = curl_execute(); 
     $this->result = !(curl_error()); 
     return $out; 
    } 
    function getMyClassName() { 
     return 'CurlRetriever is my name!'; 
    } 
} 

class PhpRetriever extends AbstractRetriever { 
    function fetch($url) { 
     $out = file_get_contents($url); 
     $this->result = ($out !== FALSE); 
     return $out; 
    } 
    function getMyClassName() { 
     return 'PhpRetriever'; 
    } 
} 

совершенно иной абстрактный класс (не связанный с интерфейсом), с подклассом, который реализует наш интерфейс:

abstract class AbstractDog { 
    function bark() { 
     return 'Woof!'; 
    } 
} 

class GoldenRetriever extends AbstractDog implements IRetrieveData { 
    // this class has a completely different implementation 
    // than AbstractRetriever 
    // so it doesn't make sense to extend AbstractRetriever 
    // however, we need to implement all the methods of the interface 
    private $hasFetched = false; 

    function getResult() { 
     return $this->hasFetched; 
    } 

    function fetch($url) { 
     // (some retrieval code etc...) 
     $this->hasFetched = true; 
     return $response; 
    } 
    function getMyClassName() { 
     return parent::bark(); 
    } 
} 

Теперь, в другом коде, может это сделать:

function getStuff(IRetrieveData $retriever, $url) { 
    $stuff = $retriever->fetch($url); 
} 

, и мы не должны беспокоиться, какой из поисковиков (локон, PHP, или Золотой) будут переданы в, и как они собираются достичь цели, так как все Shou ld быть способным вести себя аналогичным образом.Вы можете сделать это и с абстрактным классом, но тогда вы ограничиваете себя на основе предков классов, а не его возможностей.

+0

Ty для примера .... + 1 – FlyingCat

+0

@ Джерри: Добро пожаловать. – Piskvor

1
"An Abstract Class can contain default Implementation, where as an 
Interface should not contain any implementation at all. " 

Что касается применения в реальном мире ... это действительно сводится к контексту.

Например, был question on here the other day about implementing a game using PHP. Здесь у них был абстрактный класс, определяющий монстра, и любой монстр может быть основан на этом абстрактном классе. Это позволило наследовать свойства монстра по умолчанию.

Принимая во внимание, что для интерфейса вы определяете общие требования к способу «интерфейса» (pardon using термин в объяснении) некоторой системы. Пример этого из недавнего проекта, который я сделал. Я применил soapclient в php для взаимодействия с soapserver от третьего лица. Этот интерфейс определяет, какие мыльные методы поддерживает сервер, и поэтому любой класс, реализующий мой интерфейс, должен определить эти методы.

5

Multiple против одного наследования:

  • Вы можете наследовать только от одного абстрактного класса
  • Вы можете реализовать несколько интерфейсов

Реализация:

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

Это то, что я знаю с головы.

1

Метафора, которую я слышал лучше всего, заключалась в том, что абстрактным классом является полузавершенный класс. Это не сделано; вы все равно должны его закончить. Поэтому, когда вы создаете класс, который расширяет абстрактный класс, вы просто завершаете то, что вы начали в абстрактном классе. Вот почему вы не можете создать экземпляр абстрактного класса; что вы сделали его абстрактным, означает, что он неполный. Он по-прежнему нуждается в дополнительной функциональности.

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

Смежные вопросы