Разные языки подходят к разработке по-разному.В частности, C # и Java имеют сильную точку зрения в отношении ОО, которая приводит к всему, что является объектом мышления (C # здесь немного слабее).При таком подходе методы расширения предоставляют простой способ расширения существующего объекта или интерфейса для добавления новых функций.
В C ++ нет методов расширения, и они не нужны.При разработке C ++, забудьте, что все является объектной парадигмой, которая, кстати, ложна даже в Java / C # [*] .В C ++ используется другое мышление, есть объекты, и у объектов есть операции, которые являются неотъемлемой частью объекта, но есть и другие операции, которые образуют часть интерфейса и не обязательно должны быть частью класса.Херб Саттер должен прочитать Что в классе? , где автор защищает (и я согласен), что вы можете легко расширить любой данный класс с помощью простых свободных функций.
Как особыйВ простом примере стандартный шаблонный класс basic_ostream
имеет несколько методов-членов для вывода содержимого некоторых примитивных типов, а затем он расширяется с помощью (также шаблонных) свободных функций, которые расширяют эту функциональность до других типов с помощью существующего открытого интерфейса.Например, std::cout << 1;
реализован как функция-член, тогда как std::cout << "Hi";
- это свободная функция, реализованная в терминах других более простых членов.
Расширяемость в C ++ достигается с помощью свободных функций, а не способамидобавления новых методов к существующим объектам.
[*] Все является не объектом.
В данном домене будет содержаться набор реальных объектов, которые можно моделироватьи операции, которые могут быть применены к ним, в некоторых случаях эти операции будут частью объекта, но в некоторых других случаях они не будут.В частности, вы найдете служебные классы в языках, которые утверждают, что все является объектом, и эти служебные классы - не что иное, как слой, пытающийся скрыть тот факт, что эти методы не принадлежатк любому конкретному объекту.
Даже некоторые операции, которые реализованы как функции-члены, на самом деле не являются операциями над объектом.Рассмотрим добавление для Complex
числового класса, как sum
(или +
) больше операций над первым аргументом, чем вторым?Почему a.sum(b);
или b.sum(a)
, не должно ли быть sum( a, b )
?
Превращение операций в методы-члены на самом деле приводит к странным эффектам, но мы к ним просто привыкли: a.equals(b);
и b.equals(a);
могут иметь совершенно разные результаты, даже если реализация equals
полностью симметрична,(Рассмотрим, что происходит, когда a
или b
является нулевым указателем)