ФорумПрограммированиеPHP для идиотов → Интерфейсы и абстрактные классы

Интерфейсы и абстрактные классы

  • Devel

    Сообщения: 27 Репутация: N Группа: Кто попало

    Spritz Янв. 18, 2012, 2:30 д.п.

    Никак не могу разобраться с вопросом: для чего нужны интерфейсы?
    И дело не в том, что я хочу поставить под сомнение целесообразность их применения, а в том, что как новичек изучающий синтаксис языка не могу въехать в саму суть использования.
    Знаю что интерфейс содержит только абстрактные методы, а наследующий его класс должен реализовать все эти методы.
    Только не пойму зачем это нужно, в реальном применении (с интерфейсами ознакомился в двух книгах по php и одной статьей).
    Например наследование помогает разработать базовую функциональность в базовом классе и расширять ее в дочерних классах. А с интерфейсами, что то никак не клеиться.
  • Flare

    Сообщения: 284 Репутация: N Группа: Кто попало

    Spritz Янв. 18, 2012, 3:49 д.п., спустя 1 час 18 минут 37 секунд

    class User{
    private $name;
    public function __construct($name) {
    $this->name = $name;
    }

    }

    class Article {
    private $author;

    public function setAuthor (UserInterface $user) { //Первый случай
    $this->author = $user;
    }
    }

    class Post {
    private $author;

    public function setAuthor ($user) { //Второй случай
    $this->author = $user;
    }
    }

    $user = new User('Vasya');

    $post = new Article();
    $post->setAuthor($user); //Первый случай

    $post = new Post();
    $post->setAuthor($post); //Второй случай


    Посмотри на 2 случая, когда заранее указывают какие данные должны прийти setAuthor, и когда не проверяют. Во втором случае ты можешь любой объект передать аргументов и никаких ошибок не будет.
    Спустя 141 сек.
    а в первом через интерфейс ограничиваешь. Еще забыл дописать в начале что
    interface UserInterface {}

    class User implements UserInterface{
    private $name;
    public function __construct($name) {
    $this->name = $name;
    }

    }
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz Янв. 18, 2012, 4:37 д.п., спустя 48 минут 20 секунд

    пример так себе, никто не мешает написать


    setAuthor(User $author)
  • Devel

    Сообщения: 27 Репутация: N Группа: Кто попало

    Spritz Янв. 18, 2012, 4:48 д.п., спустя 10 минут 46 секунд


    пример так себе, никто не мешает написать


    setAuthor(User $author)


    Согласен, на пару минут опоздал, с аналогичным сообщением

    setAuthor(User $author)
  • Flare

    Сообщения: 284 Репутация: N Группа: Кто попало

    Spritz Янв. 18, 2012, 4:54 д.п., спустя 5 минут 49 секунд

    да пример плохой все-таки и неполный,
    в общем если несколько реализаций интерфейса, то тогда бы пример подошел,
    смотри на реализацию в php паттерна стратегия там как раз идею с заменой через общий интерфейс
  • Devel

    Сообщения: 27 Репутация: N Группа: Кто попало

    Spritz Янв. 18, 2012, 4:59 д.п., спустя 5 минут 4 секунды

    Да тоже не то.
    Если даже интерфейс будет реализован дважды: в User и Article, все равно можно обойтись без интерфейса указывая в setAuthor($author) тип объекта User или Article.
  • Flare

    Сообщения: 284 Репутация: N Группа: Кто попало

    Spritz Янв. 18, 2012, 5:05 д.п., спустя 5 минут 58 секунд

    User implements UserInterface {}
    Doctor implements UserInterface {}
    Пост в блог добавляет посетитель сайта или доктор
    Спустя 173 сек.
    хотя это уже выкручивание)
  • master

    Сообщения: 3244 Репутация: N Группа: Джедаи

    Spritz Янв. 18, 2012, 5:10 д.п., спустя 4 минуты 37 секунд

    Интерфейс - это описание взаимодействия двух частей программы, двух классов, двух модулей и т.п. Используется при делегировании задачи нескольким людям.
    например класс Б используется классом А. класс А пишет один человек, класс Б другой. Чтобы сделать их работу слаженной вначале составляется правило взаимодействия этих классов. таким правилом является интерфейс для класса Б
    не всё полезно, что в swap полезло
  • Devel

    Сообщения: 27 Репутация: N Группа: Кто попало

    Spritz Янв. 18, 2012, 5:32 д.п., спустя 21 минуту 52 секунды


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


    Кажется начинаю понимать, но все же еще недопонимаю.
    Нужен пример, наверно, с ситуацией когда интерфейс просто необходим.
  • master

    Сообщения: 3244 Репутация: N Группа: Джедаи

    Spritz Янв. 18, 2012, 5:32 д.п., спустя 18 секунд

    в коде:


    // интерфейс, пишется архитектором
    // описываются типы принимаемых и возвращаемых данных, а также возможные исключения (exceptions)
    interface iKeyValue {
     /**
      * @param $key string
      * @return mixed
      */
     function getValue($key);

     /**
      * @param $key string
      * @param $value mixed
      * @exception DataWriteErrorException on error
      */
     function setValue($key, $value);
    }


    // тело программы, пишет Вася
    $dataSource = new MemcachedClass;
    if (!($dataSource instanceof iKeyValue)){
     throw new Exception('its expected ' . class($dataSource) . ' implements interface iKeyValue');
    }
    $dataSource->setValue('asdf', 123);
    print $dataSource->getValue('asdf');


    //класс MemcachedClass, пишет Петя
    class MemcachedClass implements iKeyValue{
     public function setValue($key, $value){ … }
     public function getValue($key){ … }
    }


    //класс MySQLKVClass, пишет Яков Иосифович Махерсон
    class MySQLKVClass implements iKeyValue{
     public function setValue($key, $value){ … }
     public function getValue($key){ … }
    }


    позже Вася может относительно легко сменить один используемый класс на другой
    не всё полезно, что в swap полезло
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz Янв. 18, 2012, 6:33 д.п., спустя 1 час 55 секунд

    интерфейс это контракт на выполнение некоторого набора действий, а класс это реализация этого контракта. авторитеты ооп пришли к тому, что наследование часто привносит ненужную сложность. а интерфейсы как раз суть того самого "черного ящика", к которому все стремятся.
    ιιlllιlllι унц-унц
  • Devel

    Сообщения: 27 Репутация: N Группа: Кто попало

    Spritz Янв. 19, 2012, 12:39 п.п., спустя 1 день 6 часов 6 минут

    Кажется понял.
    Все это делается ради вот этого:


    позже Вася может относительно легко сменить один используемый класс на другой


    А достигается тем, что классы используют прием и возврат данных только с помощью функций:
    function getValue($key);
    function setValue($key, $value);

    Так же как в С++ реализуется интерфейс и используются set() и get() функции (аксессоры) для доступа
  • kostyl

    Сообщения: 5210 Репутация: N Группа: Джедаи

    Spritz Янв. 19, 2012, 12:54 п.п., спустя 14 минут 57 секунд

    Devel, пока запомни как есть, потом поймешь…
  • turist_ua

    Сообщения: 32 Репутация: N Группа: Кто попало

    Spritz Янв. 19, 2012, 2:45 п.п., спустя 1 час 50 минут 51 секунду

    Через интерфейсы в PHP реализуется множественное наследование.
  • Trieg

    Сообщения: 41 Репутация: N Группа: Адекваты

    Spritz Янв. 19, 2012, 3:39 п.п., спустя 54 минуты 30 секунд

    множественное наследование != множественное наследование интерфейсов

Пожалуйста, авторизуйтесь, чтобы написать комментарий!