2013-07-16 2 views
2

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

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

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

//Java example 
public interface IPaintable{ 
    void Paint(System.Drawing.Color color); 
} 

public void Paint(IPaintable item, System.Drawing.Color color){ 
    item.Paint(color); 
} 

Но есть ли другое использование интерфейсов в PHP?

I.e. Какие преимущества я получу, используя интерфейсы в приведенном ниже коде.

//Non interface implementation 
    <?php 
    class DBPersonProvider 
    { 
     public function getPerson($givenName, $familyName) 
     { 
      /* go to the database, get the person... */ 
      $person = new Person(); 
      $person->setPrefix("Mr."); 
      $person->setGivenName("John"); 
      return $person; 
     } 
    } 

    /* I need to get person data... */ 
    $provider = new DBPersonProvider(); 
    $person = $provider->getPerson("John", "Doe"); 

    echo($person->getPrefix()); 
    echo($person->getGivenName()); 

    ?> 

    //Implementation with interface 

     <?php 
     interface PersonProvider 
     { 
      public function getPerson($givenName, $familyName); 
     } 

     class DBPersonProvider implements PersonProvider 
     { 
      public function getPerson($givenName, $familyName) 
      { 
      /* pretend to go to the database, get the person... */ 
      $person = new Person(); 
      $person->setPrefix("Mr."); 
      $person->setGivenName("John"); 
      return $person; 
     } 
    } 


    /* I need to get person data... */ 
    $provider = new DBPersonProvider(); 
    $person = $provider->getPerson("John", "Doe"); 

    echo($person->getPrefix()); 
    echo($person->getGivenName()); 
    ?> 
+0

Вы определяете ** протокол ** с использованием интерфейса. То, что вы получаете, является основой надежности. Представьте себе «Личность». У каждого человека есть тело, у которого есть органы. Поэтому ваш интерфейс будет реализовывать органы. Каждый человек отличается. Джон, Джек, Майкл, Кристина и т. Д. Все разные, но сделаны из функционально одинаковых компонентов. Поэтому, когда вы создаете нового человека, вы ** имеете **, чтобы создать свои основные части, которые взаимодействуют и заставляют тело работать. Вот почему существуют интерфейсы - они применяют протокол для любого класса реализации. –

+0

Согласен. Я указал на это в своем вопросе «Одно использование интерфейсов заключается в том, что они позволяют нам определять поведение и устанавливать ограничения на классы, которые их реализуют». –

+1

Это все, что вы получаете. Других преимуществ использования интерфейсов нет. Если у вас небольшой проект, вы, вероятно, ничего не выиграете. Однако если 50 из вас работают над проектом, и вы являетесь основным разработчиком функции - это умный переход к использованию интерфейса, который реализуется абстрактным классом, который затем расширяется классами, которые делают другие разработчики. И вы просто применяете протокол. В основном это архитектурная и организационная вещь. –

ответ

1

я пишу хорошую библиотеку, которая взаимодействует с базой данных. И я использую MySQL. Когда вы покупаете мою библиотеку, вы знаете, что она основана на MySQL, но вы катитесь с SQL Server. Я был достаточно внимателен, чтобы создавать интерфейсы для доступа к базе данных. И я представил реализацию для MySQL. Теперь вы можете реализовать свою собственную обертку SQL Server вокруг моего интерфейса доступа к базе данных, а затем использовать ее как аргумент __construct() для классов в библиотеке, которую вы будете использовать для изменения хранения перемещения до SQL Server.

Интерфейсы очень полезны для библиотеки/многоразовых кодов писателей как я :) Они контракты кода, которые должны соблюдаться. Вы знаете, что любой класс, который их реализует, будет иметь набор функций точно так же, как и объявленный им интерфейс. И вы также можете статически вводить их в аргументы функции, такие как function(MyInterface $Object), который обеспечивает на уровне компилятора PHP то, что $Object должен реализовывать MyInterface.

PS: Абстрактные классы достаточно хороши для остальной части самостоятельно написанные разработчиками потребляя кода ...

UPDATE:

/** 
* Database Access functionality blueprint. 
*/ 
interface IDatabaseAccess { 
    public function Connect(); 
    public function Query(); 
    public function Fetch(); 
} 

/** 
* Database Access functionality implementation for MySQL. 
*/ 
class MySqlDatabaseAccess implements IDatabaseAccess { 
    public function Query(){ 
     // do mysql stuff 
    } 
    public function Fetch(){ 
     // do mysql stuff 
    } 
} 

/** 
* Database Access functionality implementation for SQLServer. 
*/ 
class SqlServerDatabaseAccess implements IDatabaseAccess { 
    public function Query(){ 
     // do sqlserver stuff 
    } 
    public function Fetch(){ 
     // do sqlserver stuff 
    } 
} 

/** 
* Database Access consumer that's database system agnostic. 
*/ 
class DatabaseAccessConsumer { 
    protected $_Provider = null; 
    public function __construct(IDatabaseAccess $Provider){ 
     $this->_Provider = $Provider; 
     $this->_Provider->Connect(); 
    } 
    public function Query(){ 
     return $this->_Provider->Query(); 
    } 
    public function Fetch(){ 
     return $this->_Provider->Fetch(); 
    } 
} 

^код, который должен говорить сам.

+0

Согласен. Я все это указал на мой вопрос. «Одно использование интерфейсов заключается в том, что они позволяют нам определять поведение и устанавливать ограничения на классы, которые их реализуют». –

+0

@JayBhatt Итак, что еще вам нужно? – CodeAngry

+0

Если я создаю коммерческий продукт, я бы определенно использовал интерфейсы, поскольку они обеспечивали бы хорошее направление для будущих разработок. Я пишу простое приложение, и в этом контексте какие преимущества будут предлагать интерфейсы? –

1

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

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

Пример (синтаксически не действует):

class A { 
    public foo() { 
     echo 'I am A and I foo'; 
    }; 
    public 
} 

class B { 
    public foo() { 
     echo 'I am B and I foo'; 
    } 
} 

class C extends A, B { // invalid 
    public bar() { 
     foo(); // which one? A's or B's? 
    } 
} 

Второй пример:

class A { 
    public foo() { 
     echo 'I am A and I foo'; 
    }; 
} 

interface iB { 
    public foo(); 
    public bar(); 
} 

interface iC { 
    public foo(); 
    public qux(); 
} 

class D extends A implements iB, iC { 

    public bar() { 
     foo(); // no ambiguity, this is A::foo(), even if the method is also declared in the interfaces 
    } 

    public qux() {} 
} 
1

Интерфейсы только чертежи классов - они способы сказать: «Если вы собираетесь что-то делать с этот тип класса, он должен иметь это и делать это ». Это позволяет вам контролировать - в какой степени другой класс будет иметь/делать как минимум для данной ситуации. Не каждая ситуация требует итерации. Интерфейсы лучше всего использовать в ситуациях, когда вам нужно иметь некоторый контроль над базовым кодом определенных классов, но вы, возможно, не тот, кто их записывает. Если вы знаете, что расширенные классы будут иметь свойства x и y, то вы можете выполнить базовую поддержку будущего класса.

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