Форум → Программирование → PHP для идиотов → Интерфейсы и абстрактные классы
Интерфейсы и абстрактные классы
Страницы: ← Следующая страница →
-
Никак не могу разобраться с вопросом: для чего нужны интерфейсы?
И дело не в том, что я хочу поставить под сомнение целесообразность их применения, а в том, что как новичек изучающий синтаксис языка не могу въехать в саму суть использования.
Знаю что интерфейс содержит только абстрактные методы, а наследующий его класс должен реализовать все эти методы.
Только не пойму зачем это нужно, в реальном применении (с интерфейсами ознакомился в двух книгах по php и одной статьей).
Например наследование помогает разработать базовую функциональность в базовом классе и расширять ее в дочерних классах. А с интерфейсами, что то никак не клеиться. -
Янв. 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;
}
} -
Янв. 18, 2012, 4:37 д.п., спустя 48 минут 20 секунд
пример так себе, никто не мешает написать
setAuthor(User $author) -
Янв. 18, 2012, 4:48 д.п., спустя 10 минут 46 секунд
пример так себе, никто не мешает написать
setAuthor(User $author)
Согласен, на пару минут опоздал, с аналогичным сообщением
setAuthor(User $author) -
Янв. 18, 2012, 4:54 д.п., спустя 5 минут 49 секунд
да пример плохой все-таки и неполный,
в общем если несколько реализаций интерфейса, то тогда бы пример подошел,
смотри на реализацию в php паттерна стратегия там как раз идею с заменой через общий интерфейс -
Янв. 18, 2012, 4:59 д.п., спустя 5 минут 4 секунды
Да тоже не то.
Если даже интерфейс будет реализован дважды: в User и Article, все равно можно обойтись без интерфейса указывая в setAuthor($author) тип объекта User или Article. -
Янв. 18, 2012, 5:05 д.п., спустя 5 минут 58 секунд
User implements UserInterface {}
Doctor implements UserInterface {}
Пост в блог добавляет посетитель сайта или докторСпустя 173 сек.хотя это уже выкручивание) -
Янв. 18, 2012, 5:10 д.п., спустя 4 минуты 37 секунд
Интерфейс - это описание взаимодействия двух частей программы, двух классов, двух модулей и т.п. Используется при делегировании задачи нескольким людям.
например класс Б используется классом А. класс А пишет один человек, класс Б другой. Чтобы сделать их работу слаженной вначале составляется правило взаимодействия этих классов. таким правилом является интерфейс для класса Бне всё полезно, что в swap полезло -
Янв. 18, 2012, 5:32 д.п., спустя 21 минуту 52 секунды
Интерфейс - это описание взаимодействия двух частей программы, двух классов, двух модулей и т.п. Используется при делегировании задачи нескольким людям.
например класс Б используется классом А. класс А пишет один человек, класс Б другой. Чтобы сделать их работу слаженной вначале составляется правило взаимодействия этих классов. таким правилом является интерфейс для класса Б
Кажется начинаю понимать, но все же еще недопонимаю.
Нужен пример, наверно, с ситуацией когда интерфейс просто необходим. -
Янв. 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 полезло -
Янв. 18, 2012, 6:33 д.п., спустя 1 час 55 секунд
интерфейс это контракт на выполнение некоторого набора действий, а класс это реализация этого контракта. авторитеты ооп пришли к тому, что наследование часто привносит ненужную сложность. а интерфейсы как раз суть того самого "черного ящика", к которому все стремятся.ιιlllιlllι унц-унц -
Янв. 19, 2012, 12:39 п.п., спустя 1 день 6 часов 6 минут
Кажется понял.
Все это делается ради вот этого:
позже Вася может относительно легко сменить один используемый класс на другой
А достигается тем, что классы используют прием и возврат данных только с помощью функций:
function getValue($key);
function setValue($key, $value);
Так же как в С++ реализуется интерфейс и используются set() и get() функции (аксессоры) для доступа -
-
Янв. 19, 2012, 2:45 п.п., спустя 1 час 50 минут 51 секунду
Через интерфейсы в PHP реализуется множественное наследование. -
Янв. 19, 2012, 3:39 п.п., спустя 54 минуты 30 секунд
множественное наследование != множественное наследование интерфейсов
Страницы: ← Следующая страница →
Пожалуйста, авторизуйтесь, чтобы написать комментарий!