Автор оригинала: texrdcom
Да понятно что для улутшения работы команды для разбора кода по классу видно какие интерфейсы он включает и естествено в нем есть данные функции.
С этим разобрался.
Но в многих статьях даже в деталях написанно что интерфейсы можно использовать для множественого наследования -? чего интерфейсов -?
ведь интерфейс не может наследовать клас. Я правильно понимаю ?
Их нельзя использовать для множественного наследования, т.к. у интерфейсов нечего наследовать.
Ещё один пример с интерфейсами. Пусть ты пишешь ОС на PHP, и тебе нужно написать кусок кода, который получает от мышки её координаты и состояние клавишь. Но у тебя ещё нет ни одного работающего драйвера мыши, да собственно их вообще ещё нет, так как никто не знает как их писать.
Вот ты и пишешь интерфейс доступа к драйверу мыши (т.е. просто указываешь, какие функции ты будешь использовать):
interface MouseDriver {
public function getX();
public function getY();
public function button1Clicked();
public function button2Clicked();
...
}
Всё, теперь везде в своей программе, которая обращается к драйверу мыши в качестве аргумента указываешь, что тебе нужен класс, реализующий интерфейс драйвера мыши:
function displayMouseCursor(MouseDriver $driver) {
$x = $driver->getX();
$y = $driver->getY();
...
}
Пишешь тестовый драйвер мыши и тестируешь свою прогу на нём. Вот и всё.
Теперь другие разработчики (компании производители мышек) просто пишут свои конкретные классы, реализующие твой интерфейс и всё работает (если конечно в этих новых классах нет ошибок).
Вывод: если у тебя не похожая ситуация, тебе НЕ НУЖНЫ интерфейсы. Интерфейсы нужны только для обозначания методов, которые должны выполнять реализующие их классы.
Про наследование. Наверно ты имел в виду нечто следующее:
PHP:
class A implements interfaceA, interfaceB {....}
Это нужно, если у тебя один класс реализует функции сразу нескольких интерфейсов (например, он и драйвер мыши, и драйвер клавиатуры). Ни о каком множественном НАСЛЕДОВАНИИ здесь речи нет.
Абстрактные класс похожи на интерфейсы. Разница в том, что в абстрактных классах ты можешь заранее прописать логику, которая будет действительно наследоваться в дальнейшем.
Например:
PHP:
abstract class InchesMouseDriver implements MouseDriver {
public function getX() {
return $this->inchesToPixels($this->getInchX());
}
public function getY() {
return $this->inchesToPixels($this->getInchY());
}
public function InchesToPixels($inches) {
return round($inches*150);
}
abstract funtion getInchX();
abstract function getInchY();
abstract function button1Clicked();
....
}
Надеюсь смысл понятен - теперь ты наследуешь этот класс и просто переопределяешь getInchX и getInchY, и тебя уже не заботит, что мышка возвращает положение в дюймах.
БОЛЬШОЙ ВЫВОД: В маленьких проектах интерфейсы и абстрактные классы скорее всего не нужны.