В C или C ++ есть способ расширить класс без наследования?

Это ответ на несколько иной вопрос, но поскольку я сам застрял в этом, я надеюсь, что это может быть полезно для кого-то другого.

Если вы хотите использовать allow_redirects=False и перейти непосредственно к сначала перенаправляйте объект, а не следуя цепочке из них, и вы просто хотите получить место перенаправления непосредственно из объекта ответа 302, тогда r.url не будет работать. Вместо этого это заголовок «Местоположение»:

r = requests.get('http://github.com/', allow_redirects=False)
r.status_code  # 302
r.url  # http://github.com, not https.
r.headers['Location']  # https://github.com/ -- the redirect destination
14
задан Jon Seigel 28 May 2010 в 01:05
поделиться

4 ответа

Что касается методов расширения C #: Не напрямую. C ++ в этих вещах меньше нуждается, потому что C ++ поддерживает бесплатные функции. Я никогда не использовал Objective-C, поэтому не могу здесь комментировать.

0
ответ дан 1 December 2019 в 09:12
поделиться

C ++ не имеет закрытых классов или наследования одного класса, поэтому в большинстве случаев вы можете создать подкласс базового класса. Есть творческие способы сделать класс ненаследуемым, но их немного, и они далеко друг от друга. В общем, у C ++ нет проблем, которые есть у C #, которые породили методы расширения.

C не является объектно-ориентированным, поэтому вопрос на самом деле не актуален.

1
ответ дан 1 December 2019 в 09:12
поделиться

Не совсем. Это не способ обращения с классами в C ++.

Среди прочего, Мейерс утверждает, что лучше всего иметь небольшой класс с минимальным набором операций, которые делают его полностью полезным. Если вы хотите расширить набор функций, вы можете добавить пространство имен служебной программы (например, пространство имен ClassUtil), которое содержит служебные функции, не являющиеся членами, которые работают с этим минимальным классом. Добавлять функции в пространство имен легко из любого места.

Вы можете проверить обсуждение темы здесь .

4
ответ дан 1 December 2019 в 09:12
поделиться

Можете ли вы использовать интерфейс? Методы расширения - это простой способ избежать подклассификации, но они становятся полубесполезными при использовании правильных методов ОО. Причина, по которой они так часто используются в Linq, заключается в том, что команде VS не пришлось обновлять код, который, скорее всего, сломал бы множество старых приложений.

Согласно MSDN: "В общем, мы рекомендуем применять методы расширения редко и только тогда, когда это необходимо. По возможности, клиентский код, который должен расширять существующий тип, должен делать это путем создания нового типа, производного от существующего типа."

http://msdn.microsoft.com/en-us/library/bb383977.aspx

0
ответ дан 1 December 2019 в 09:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: