Автор оригинала: Crazy
Тем, что при чтении кода может складываться неверное представление о том, какой именно код здесь будет выполнен.
Что-то я смотрю у тебя, наверное после PHP, сложилось неверное представление об ООП. Перегрузка, или более точный перевод -
совмещение (overloading) - это один из основных механизмов полиморфизма и повторного использования кода. Суть перегрузки в том, что она позволяет создавать различные
реализации одной и той же
спецификации. То есть, смысловую нагрузку несет имя метода, а какой код будет выполнен -- решать механизму совмещения. При этом, если, например, совмещенный метод называеться
Add в классе реализующем список произвольных объектов, то какой бы вариант кода не вызывалься, понятно, что он будет выполнять добавление объекта к списку, согласно его спецификации. Теперь вы можете в том же класе, или в любом производном сколько угодно добавлять совмещенных методов
Add, каждый из которых выполняет свой собственный код, в соответствии со своей спецификой, например метод , но реализующий общую
спецификацию Add(int pos, string item) добавляет строку как элемент списка в указанную позицию, а метод
Add(string item) добавляет строку в конец списка. Но при этом все они реализую общую
спецификацию -- добавление элемента в список.
На PHP такое не реализуеш:
PHP:
class StringList : public List
{
virtual int Add(String *item);
virtual int Add(int pos, String *item);
virtual int Add(int pos, int count, String *items[]);
virtual int Add(int count, String *items[]);
}
StringList *list = new StringList();
list->Add("Ну");
list->Add("непонятного?");
list->Add(1, 2, new String[] {"что", "тут"});
list->Add(2, new String[] {"это", "C++"});
Хотя нет, вру, реализовать можно, но как:
PHP:
class StringList extends List
{
function Add($item, $pos = -1) {
// Если pos == -1, то добавляем в конец списка
// иначе, добавлем в указанную позицию
// о и еще одно, не забыть проверить, что $item -- строка, а $pos -- число.
}
function AddRange($items, $pos = -1) {
// Аналогично, необходимы проверки типов, и аргументов.
}
}
$list = new StringList;
$list->Add("Вот");
$list->AddRange(array('на', 'PHP'));
$list->AddRange(array("это","делаеться"), 1);
$list->Add("так", 1);
Вот такая простая ситуация, а если число сигнатур метода
Add() увеличиться, то в PHP придеться создавать методы с различными именами, и вся иллюзия присутствия, хотя бы возможности реализации, совмещения и полиморфизма в PHP исчезает.
-~{}~ 14.06.07 10:04:
Автор оригинала: Crazy
Я отвечу, что:
1. Перегрузка вредна. Практически не существует случаев, когда от нее больше пользы, чем вреда.
2. Доля людей, профессионально пишущих на C++, в программистском сообществе слищкомнизка, чтобы кто-то всерьез ориентировался на привычки человека, после 10 лет программирования на C++ решившего перейти на PHP.
3. Перегрузка вообще не имеет никакого отношения к ООП.
Пункт 3 - см. мой предыдущий пост, или лучше возми наконец, любую книжку про ООП и прочитай.
Пункт 2 - Доля людей, профессионально пишущих программы вообще и на C++, в частности конечно же намного меньше разных быдлокодеров и недопрограммеров, считающих себя хакерами, написав очередной "заменитель Notepad'а" или скрипт доски объявлений, который падает каждый третий релоад сыплет варнингами и фаталами как из рога изобилия.
Кроме того, это как ж с какого перепугу проф. программер C++ решить перейти на PHP?
Пункт 1 - скажи это Гради Бучу