Пожалуйста покажите от какой ручной проверки при этом коде освобождается.Очень надо. То есть код, если будет иначе.Пример! Спасибо большое!
На самом деле, там может быть гораздо сложнее. непример, если $engine не входит в иерархию Engine, а берется из какого нить компонента. В общем, все не так тривиально, как кажется.
Sergey89 Против второго варианта ничего не имею, там все ок. А что касается этого - PHP: <?php interface Vehicle { public function drive(); } abstract class Car implements Vehicle { } class Nissan extends Car { public function drive() {/* */} } Здесь объявление класса Car, пусть и абстрактного, не соответствует интерфейсу. И если PHP позволяет такое - значит, бага, т.к. нарушаются принципы ООП.
я использую интерфейсы примерно так PHP: <? interface temp { const $str1 = "first"; const $str2 = "second"; } class myClass1 implements temp{ function print_str() { echo "this is ".self::str1." string in myClass1"; } } class myClass2 implements temp{ function print_str() { echo "this is ".self::str2." string in myClass2"; } } вообще такое использование интерфейсов правильно?
Я пупею от нашего любимого PHP и его взглядов на ООП нет блин, неправильно! Не должно быть в интерфейсах никаких констант. Это опять из оперы абстрактных классов.
А можно увидеть вариант как правильно?) Мне просто надо в класс "подгрузить" некоторые общие, для нескольких классов, константные переменные. Как это сделать правильно? У меня маловато опыта еще в этих делах
"Ключевое различие между абстрактным классом и интерфейсом состоит в том, что абстрактный класс может содержать полностью реализованные методы, в то время как интерфейс содержит только их обьявления.Используйте абстрактные классы, если хотите обеспечить одинаковые методы для всех подклассов и сохранить для них некоторую общую функциональность.Интерфейсы следует применять в том случае, если реализация всех методов для разных подклассов должны отличаться."
Если это действительно так, тогда интерфейсам грош цена, и я с трудом представляю где без них реально не обойтись.
Dagdamor PHP: <?php interface Vehcile { // ... } interface Car extends Vehcile { // ... } class Nissan implements Car { } Тоже нарушение принципов ООП?
Я тебе всё намекаю, что разница между абстрактным классом и интерфейсом только в том, что абстрактный класс может содержать общую для разных классов реализацию методов.
Вообще, мысль Дагдомора мне понятна, и как бы более импонирует, на самом деле. Кстати, за это говорит и то, что обьект не должен бы предоставлять непосредственного доступа к даннным, соотвественно, обязывать его через интерфейс иметь какие то константы или свойства несколько... не комильфо. Как и попустительствовать абстрактному классу не иметь методов, указанных в интерфейсе. Я понимаю, что в принципе, указание абстрактному классу интерфейса несколько абсурдно, но тем не менее.
Ну например так. Представь что ты пишешь игру. В ней есть монстры. Наземные и летающие. Соответственно у тебя есть абстрактный класс "наземные" и не менее абстрактный класс "летучие". От первого наследуются класс "звери" и его объекты это львы и зебры, от второго "птицы" - канарейки и орлы. Но при этом львы и орлы - хищники, а канарейки и зебры нет. И вот появляется интерфейс "хищник", с методами "преследовать добычу", "убивать добычу" и "жрать_мясо". Причем они по разному преследуют, по-разному убивают и по-разному жрут мясо. Львы и орлы имплементируют этот интерфейс, а канарейки нет. При этом ты можешь объявить Хищник орел1 = new Птица() Хищник лев1 = new Зверь () после этого с орлами и львами можно обращаться и как с хищниками и как с зверями/птицами. В общем, интерфейсы это замена множественного наследования. Причем обращение к суперклассу это обращение только к одному классу, а не к нескольким.
karakh Никакая это не замена. Ты же не наследуешь ничего. Например, если у всех хищников есть некий базовый метод, например Переваривать_Мясо, который одинаков и для летающих хищников, и для наземных, тебе будет просто некуда этот базовый метод впихнуть. Придется либо добавлять его в класс Животное (а вегетарианцам он нафиг не сдался), либо копировать для каждого хищника отдельно.
karakh самый нормальный ответ... вообще не пойму дискусси, всё просто - класс может наследовать только одник абстрактный класс в парэнте, а интерфейсов он может наследовать НЕСКОЛЬКО - в этом вся суть МНОЖЕСТВЕННОЕ НАСЛЕДОВАНИЕ. Если ктото не предстваляет как это применить и где без этого не обойтись - то это его проблема, а те, кто в свое время всосал С и С++ вообще бы даже топик не смотрели...
Кто-нибудь, объясните мне, что есмь "наследование классом интерфейса", я понять не могу... и какое отношение это имеет к множественному наследованию...
Что есть "наследование классом интерфейса" я не знаю. Класс не наследует интерфейс а имплементирует (как бы это по-русски сказать?). Если нужна миграция разных животных на юг, то можно сделать десяток Животное <тварь_1> = new Птица() /Зверь и вызвать каждому метод "лететь(юг)". И куча животных отправятся на юг, питаясь по пути кто чем умеет. Хищные, травоядные, насекомоядные - любые. Если нужна толпа разных хищников (зверей и птиц, а заодно и троллей, не относящихся к классу Животные вообще) охотящихся на зайца, то создается Хищник <тварь_1> = new Птица()/Зверь() и вызвать каждому "преследовать(заяц)". И куча хищников - кто бегом, кто в полете - будут преследовать зайца. То есть они будут создаваться как однотипные объекты в каждом случае и ими можно будет оперировать скопом, не думая, есть ли у этой птицы метод "охотиться" в каждом отдельном случае. сделать массив хищников и применить к ним одно и то же действие. Сделать массив животных и применить к ним всем другое действие, не думая об их пищевых пристрастиях. Да, при этом не наследуются одинаковые базовые методы. Их приходится описывать для каждого класса, имплементирующего интерфейс. Это то, чем обычное множественное наследование лучше - меньше возни и копирования кода. Но если у класса-потомка при вызове конструктора вызывается конструктор суперкласса - а это очень частая ситуация - то при множественном наследовании будет проблема выбора, а при имплементации интерфейса нет. Это то чем лучше интерфейсы - лучше "понимаемость" кода и меньше коллизий.