Пуля — дура. Пых — молодец.

Добро пожаловать на Пыху!

Логин:
Пароль:
 

Нет прописки? Зарегистрируйся!

Новости

Пыха переехала на новый сервер, ура!

Краснодарское время: 25 Май, 2012, 11:40:00

Страниц: [1] 2
Печать
Автор Тема: Интерфейсы и абстрактные классы  (Прочитано 261 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Devel    ↓ 
18 Январь, 2012, 02:30:58
НЕ ХУЕТА! ХУЕТА!


Карма: -1
Сообщений: 29
Сила слова: -3.45

Никак не могу разобраться с вопросом: для чего нужны интерфейсы?
И дело не в том, что я хочу поставить под сомнение целесообразность их применения, а в том, что как новичек изучающий синтаксис языка не могу въехать в саму суть использования.
Знаю что интерфейс содержит только абстрактные методы, а наследующий его класс должен реализовать все эти методы.
Только не пойму зачем это нужно, в реальном применении (с интерфейсами ознакомился в двух книгах по php и одной статьей).
Например наследование помогает разработать базовую функциональность в базовом классе и расширять ее в дочерних классах. А с интерфейсами, что то никак не клеиться.
Записан
Flare    ↓ 
18 Январь, 2012, 03:49:35 , спустя 1 час 18 минут 37 секунд
НЕ ХУЕТА! ХУЕТА!


Карма: 9
Сообщений: 253
Сила слова: 3.56

PHP
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, и когда не проверяют. Во втором случае ты можешь любой объект передать аргументов и никаких ошибок не будет.  
Спустя 2 минуты 21 секунду добавил
а в первом через интерфейс ограничиваешь. Еще забыл дописать в начале что
PHP
interface UserInterface {}
 
class User implements UserInterface{
    private $name;
    public function __construct($name) {
        $this->name = $name;
    }
 
}
Записан

Если программист в 07.00 утpа на pаботе, значит он там ночевал...
Абырвалг    ↓ 
18 Январь, 2012, 04:37:55 , спустя 48 минут 20 секунд
НЕ ХУЕТА! ХУЕТА!

PHP Infected, симфоеб, маконенавистник
Группа: Джедаи

Карма: 80
Сообщений: 6096
Сила слова: 1.31

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

setAuthor(User $author)
Записан

PHP does the job since 1995
Пожалуйста, не надо делать двойные клики по ссылкам. Это создает избыточную нагрузку на сервер
Devel    ↓ 
18 Январь, 2012, 04:48:41 , спустя 10 минут 46 секунд
НЕ ХУЕТА! ХУЕТА!


Карма: -1
Сообщений: 29
Сила слова: -3.45


пример так себе, никто не мешает написать
 
 
setAuthor(User $author)

Согласен, на пару минут опоздал, с аналогичным сообщением
 
setAuthor(User $author)
Записан
Flare    ↓ 
18 Январь, 2012, 04:54:30 , спустя 5 минут 49 секунд
НЕ ХУЕТА! ХУЕТА!


Карма: 9
Сообщений: 253
Сила слова: 3.56

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

Если программист в 07.00 утpа на pаботе, значит он там ночевал...
Devel    ↓ 
18 Январь, 2012, 04:59:34 , спустя 5 минут 4 секунды
НЕ ХУЕТА! ХУЕТА!


Карма: -1
Сообщений: 29
Сила слова: -3.45

Да тоже не то.
Если даже интерфейс будет реализован дважды: в User и Article, все равно можно обойтись без интерфейса указывая в setAuthor($author) тип объекта User или Article.
Записан
Flare    ↓ 
18 Январь, 2012, 05:05:32 , спустя 5 минут 58 секунд
НЕ ХУЕТА! ХУЕТА!


Карма: 9
Сообщений: 253
Сила слова: 3.56

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

Если программист в 07.00 утpа на pаботе, значит он там ночевал...
master    ↓ 
18 Январь, 2012, 05:10:09 , спустя 4 минуты 37 секунд
НЕ ХУЕТА! ХУЕТА!

Квадратов сколько видишь ты?
Группа: Джедаи

Карма: 44
Сообщений: 2080
Сила слова: 2.12

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

Devel    ↓ 
18 Январь, 2012, 05:32:01 , спустя 21 минуту 52 секунды
НЕ ХУЕТА! ХУЕТА!


Карма: -1
Сообщений: 29
Сила слова: -3.45


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

Кажется начинаю понимать, но все же еще недопонимаю.
Нужен пример, наверно, с ситуацией когда интерфейс просто необходим.
Записан
master    ↓ 
18 Январь, 2012, 05:32:19 , спустя 18 секунд
НЕ ХУЕТА! ХУЕТА!

Квадратов сколько видишь ты?
Группа: Джедаи

Карма: 44
Сообщений: 2080
Сила слова: 2.12

в коде:
 
PHP

// интерфейс, пишется архитектором
// описываются типы принимаемых и возвращаемых данных, а также возможные исключения (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){ ... }
}
 

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

Status    ↓ 
18 Январь, 2012, 05:32:35 , спустя 16 секунд
НЕ ХУЕТА! ХУЕТА!

Редкостная сволочь
Группа: Джедаи

Карма: 57
Сообщений: 1447
Сила слова: 3.94

Интерфейсы придумали бездельники что бы доки не писать, а так они на хуй не нужны:D
Записан

Заткнись говно, я воевал!
artoodetoo    ↓ 
18 Январь, 2012, 06:33:14 , спустя 1 час 39 секунд
НЕ ХУЕТА! ХУЕТА!

с особым цинизмом
Группа: в ухо

Карма: 124
Сообщений: 3805
Сила слова: 3.26

интерфейс это контракт на выполнение некоторого набора действий, а класс это реализация этого контракта. авторитеты ооп пришли к тому, что наследование часто привносит ненужную сложность. а интерфейсы как раз суть того самого "черного ящика", к которому все стремятся.
Записан
Devel    ↓ 
20 Январь, 2012, 12:39:19 , спустя 1 день 6 часов 6 минут 5 секунд
НЕ ХУЕТА! ХУЕТА!


Карма: -1
Сообщений: 29
Сила слова: -3.45

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

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

А достигается тем, что классы используют прием и возврат данных только с помощью функций:
function getValue($key);
function setValue($key, $value);
 
Так же как в С++ реализуется интерфейс и используются set() и get() функции (аксессоры) для доступа
Записан
kostyl    ↓ 
20 Январь, 2012, 12:54:16 , спустя 14 минут 57 секунд
НЕ ХУЕТА! ХУЕТА!

занедельный антипаттерн
Группа: Джедаи

Карма: 60
Сообщений: 3526
Сила слова: 1.7

Devel, пока запомни как есть, потом поймешь...
Записан

качество жизни обратно пропорционально количеству лени
turist_ua    ↓ 
20 Январь, 2012, 02:45:07 , спустя 1 час 50 минут 51 секунду
НЕ ХУЕТА! ХУЕТА!


Карма: 0
Сообщений: 28
Сила слова: 0

Через интерфейсы в PHP реализуется множественное наследование.
Записан
Страниц: [1] 2
Печать
 

Перейти в: