2010-02-02 5 views
9

Я хотел бы знать, если метод расширения C# основан на любом существующем шаблоне проектирования.C# Методы расширения - шаблоны проектирования

+0

Не используйте методы расширения, см. Эту запись Блог Eric Lipperts «foreach V's ForEach» http://blogs.msdn.com/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx –

ответ

11

Шаблон дизайна - это просто известная парадигма, то есть «когда вы хотите достичь X, сделать Y». Хорошо известной парадигмой в объектно-ориентированных языках, таких как C#, является «когда вы хотите воздействовать на состояние объекта, вызывать метод на его экземпляре».

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

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

4

№ Это просто функция языка.

+0

Это может быть и то, и другое. Например, делегаты - это функция языка C#, которая позволяет использовать шаблон Publisher-Subscriber. – Anthony

0

Конечно, вы можете использовать методы расширения C#, если хотите реализовать определенные шаблоны проектирования. Например, имитировать mixins в C#.

0

Я бы не маркировать методы расширения, как любой из общих шаблонов проектирования, но он может быть использован для реализации модели, как, декоратор и адаптер и т.д ..

1

Они не основаны на существующем шаблоне дизайна. Когда эта «особенность» была впервые представлена ​​в Delphi, под названием 'class helpers', Borland даже предупредила пользователей от них. They were considered a bit of a hack, но теперь пыль поселилась, они нашли свое собственное место.

Как и все остальное, используйте, когда это необходимо.

1

Нет, это не так, потому что они всего лишь синтаксический сахар.

+0

Хорошо, строго говоря, методы расширения - это не солнцезащитный сахара. Но ваша способность вызывать их с тем же синтаксисом, что и методы экземпляра. –

+1

Если вы мне не верите, вы можете просто попытаться найти в Google эту фразу: «методы расширения - это синтаксический сахар», и вы можете найти сотни ссылок, которые подтверждают мое мнение. –

+1

Руна, без этой способности методы расширения - это просто обычные статические методы. «Ваша способность называть их с тем же синтаксисом, что и методы экземпляра» * - это единственная функция методов расширения, и, как вы сказали сами, эта функция является синтаксическим сахаром. –

8

Методы расширения можно рассматривать как замену Visitor Pattern. Также предлагается использовать их как Adapters.

На общих языках развивается необходимость в необходимости использования шаблонов проектирования. Есть цитата, например, что Lisp не нуждается в шаблонах проектирования, потому что все построено на этом языке. Итак, правильный вопрос будет заключаться в том, какие шаблоны проектирования заменяют методы расширения?

+1

Более точно, (хорошие) языки имеют тенденцию развиваться, чтобы упростить использование популярных шаблонов дизайна. Также обратите внимание, что вы никогда не сможете уйти от использования шаблонов проектирования, каждый дизайн - это шаблон дизайна, язык шаблонов проектирования - это просто способ формализовать эту идею и способствовать использованию некоторых известных и проверенных шаблонов (таким же образом, что арка или контрфорс - это хорошо известный шаблон проектирования в архитектуре). – Wedge

1

Нет, но методы расширения превосходны для реализации определенных шаблонов дизайна GoF (например, Prototype).

0

Лучшим подходящим шаблоном дизайна для расширения является шаблон фасада. My Reason: Мы обычно используем методы расширения, чтобы не вводить новую функциональность за пределы ответственности целевого класса, а упрощать использование существующего целевого класса. Поскольку упрощение использования целевого класса является проблемой шаблона Facade, альтернативные методы расширения могут быть реализованы с использованием шаблона Facade. Существуют некоторые проблемы в расширении и модульных методах расширения. Поэтому я думаю, что внедрение шаблона Facade - лучший подход к использованию методов расширения. Однако возможно реализовать некоторые методы расширения, которые обертывают интерфейс фасада, чтобы обеспечить средство кодирования для кодов клиентов.

+0

Не могли бы вы объяснить свой ответ, чтобы объяснить, почему? – slfan

Смежные вопросы