c # Методы расширения - шаблоны проектирования - PullRequest
9 голосов
/ 02 февраля 2010

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

Ответы [ 10 ]

11 голосов
/ 02 февраля 2010

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

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

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

8 голосов
/ 02 февраля 2010

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

В целом, языки развиваются, чтобы уменьшить необходимость в шаблонах проектирования. Например, есть цитата, что Лисп не нуждается в шаблонах проектирования, потому что все построено на языке. Таким образом, правильный вопрос будет таким: какие шаблоны проектирования заменяют методы расширения?

4 голосов
/ 02 февраля 2010

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

2 голосов
/ 02 февраля 2010

Они не основаны на существующей схеме проектирования.Когда эта «функция» была впервые представлена ​​в Delphi под именем «помощники по классам» , Borland даже предупреждал пользователей о них. Их считали чем-то вроде взлома , но теперь пыль осела, они нашли свое место.

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

1 голос
/ 02 февраля 2010

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

1 голос
/ 02 февраля 2010

Наиболее близким каноническим шаблоном дизайна, вероятно, является Шаблон декоратора .

1 голос
/ 02 февраля 2010

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

0 голосов
/ 05 июня 2016

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

0 голосов
/ 02 февраля 2010

Я бы не назвал методы расширения как какие-либо из распространенных шаблонов проектирования, но его можно использовать для реализации таких шаблонов, как Decorator, Adapter и т.

0 голосов
/ 02 февраля 2010

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

...