Автор оригинала: Demiurg
Помоему ты путаешь полиморфизм с перегрузкой функций. В php нет множественного наследствия, поэтому нет примесных классов и тд. Кстати, на сколько я помню сам Буч относится к множественнуму наследию с осторожностью. Но полиморфизм тут совсем не причем, а в php он прекрасно реализуется.
PS я давно говорил, что php не тот язык, в котором так важен ооп.
Да е мое... Я уже 1000 раз объяснял, что перегрузка методов - это всего лишь
ОДИН ИЗ СПОСОБОВ реализации полиморфизма
Возьмем следующий пример. В C (но не в С++) функция abs() возращает абсолютное значения целого числа, labs() - длинного целого, fabs() - числа с плавающей точкой.
Зачем, казалось бы, для одной и той же операции использовать разные ф-ии? Все просто - в Сях нет перегрузки. В С++, Java и любмом PHP - есть! Поентому что там используется? Правильно abs().
Так почему же вышеописанный пример не является
одинм интерфейсом для общего класса действий??? Чего, Где я путаю????
Дальше.
PHP ПОДДЕРЖИВАЕТ ПОЛИМОРФИЗМ!!! Говорю это в здравом уме и трезвом рассудке. Спасибо VS и его статье - убедил.
Но:
НЕ прекрасно
Объясняю (а не говорю - да не ребят, вы все путаете).
Берем пример из статьи VS (еще раз большое человеческое спасибо)
Function overloading works fine. You can overload member functions in child classes. Example
PHP:
class A { function foo() { echo "A::foo();"; } }
class B extends A { function foo() { echo "B::foo();"; } }
$obj = new B();
$obj->foo();
outputs B::foo();.
А теперь внимание. Здесь имеет место быть
не перегрузка методов - overload, а
переопределение методов - override
Что есть перегрузка - я уже писАл и пример приводил. Теперь о переопределении.
Если метод в подклассе имеет такое же имя и
сигнатуру типов!!!, как метод в его родит-ом классе, то метод в подклассе
переопределяет (отменяет) метод в род. классе.
А теперь самое интересное. Изменим немного пример.
PHP:
class A { function foo($c) { echo "A::foo();"; } }
class B extends A { function foo() { echo "B::foo();"; } }
$obj = new B();
$obj->foo($c);
К сожалению, я сейчас не имею возможности проверить, что выдаст PHP, но думаю - ошибку, т.к. $obj->foo($c) будет пытаться вызвать B::foo(), где не определено ниодного аргумента.
В Java при подобной конструкции $obj->foo($c) вызвовет A::foo($с), а при $obj->foo() вызовет B::foo(), т.к. здесь уже (в отличии от предыдущего примера) имеет место быть
перегрузка метода (различная сигнатура методов foo())
Итак. С терменологией вроде разобрались.
Не боясь навлечь на себя гнев великих, утверждаю, что и перегрузка и переопределние методов - это всё одни из способов реализации полиморфизма! (Но не ВСЕ!!! Понятие гораздо шире)
Дальше...
Автор оригинала: Demiurg
В php нет множественного наследствия, поэтому нет примесных классов и тд.
И в Java нету. И в обсуждении этом, тоже ничего про это нету. Это вообще отдельная песня.
Мн. наследование есть тока в C++. В Java есть тока интерфейсы - они реализуют некот. возможности мн. насл-я.
Автор оригинала: Demiurg
PS я давно говорил, что php не тот язык, в котором так важен ооп.
Согласен на 95%.
Модераторы. Давайте вы закроете эту тему. Я остановится уже не могу, но ж. чую - меня скоро запинают с этим гребанным полиморфизмом