Classes - первые шаги...

Статус
В этой теме нельзя размещать новые ответы.

gam

Guest
Автор оригинала: [VS]
Где написано? Мне действительно интересно.
Я всегда считал, что перегрузка функции это
class A
{
int foo(int a) { return a; }
};
class B : public A
{
int foo(int a) { return a+1; }
};
Ну честное слово! :))

Вот, не поленился залесть и:
Цитата:
В языке Java в пределах одного класса можно определить два или более методов, которые совместно используют одно и то же имя, но имеют разное кол-во параметров. Когда это имеет место, методы называют перегруженными, а о процессе говорят как о перегрузке методов .

Кроме того, для определения метода при вызове, Ява может руководствоваться типом параметров (пример я давал)

П Ноутон. Г. Шилд. Java2. стр. 158.
 

Demiurg

Guest
Автор оригинала: gam
Цитата: Полиморфизм - свойство, которое, позволяет использовать один интерфейс для общего класса действий.

В Java в пределах одного класса можно определить 2 или более методов, которое совместно используют одно и тоже имя, но имеют разно кол-во параметров. (в PHP - в пред. 1-ого класса - тока один!) . - это собственно и есть нормальная перегрузка, как я ее понимаю.
Помоему ты путаешь полиморфизм с перегрузкой функций. В php нет множественного наследствия, поэтому нет примесных классов и тд. Кстати, на сколько я помню сам Буч относится к множественнуму наследию с осторожностью. Но полиморфизм тут совсем не причем, а в php он прекрасно реализуется.

PS я давно говорил, что php не тот язык, в котором так важен ооп.
 

gam

Guest
Автор оригинала: 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%.

Модераторы. Давайте вы закроете эту тему. Я остановится уже не могу, но ж. чую - меня скоро запинают с этим гребанным полиморфизмом :)
 

Demiurg

Guest
Автор оригинала: gam
А теперь самое интересное. Изменим немного пример.
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(), где не определено ниодного аргумента.
Не поверишь, но не типизированый язык выдаст
B::foo();
:)
 

[VS]

Guest
Короче все друг с другом согласны, просто использовались разные термины.

gam: спасибо за комментарий к моей статье. исправлю.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху