Предпочитаете методы расширения для инкапсуляции и повторного использования? [закрыто]C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Предпочитаете методы расширения для инкапсуляции и повторного использования? [закрыто]

Сообщение Anonymous »

edit4: Wikified, поскольку это, по-видимому, превратилось в обсуждение больше, чем на конкретный вопрос. Это было рекомендовано Скоттом Мейерсом в этой классической статье Dr. Dobbs, и повторяется Херб Саттер и Андрей Александреску в стандартах кодирования C ++ (пункт 44); Общий аргумент заключается в том, что если функция может выполнять свою работу исключительно, полагаясь на публичный интерфейс, выявленный классом, она фактически увеличивает инкапсуляцию , чтобы он был внешней. Хотя это в некоторой степени сбивает с толку «упаковку» класса, преимущества, как правило, считаются стоимостью. C# добавляет два важных компонента в микс - первое интерфейсы, и вторые методы расширения: < /p>

[*] Интерфейсы позволяют классу формально указать свой публичный контракт, методы и свойства, которые они подвергают миру. /> Методы расширения могут быть определены on интерфейс, предоставляя любую функциональность, которая может быть реализована через интерфейс для всех реализаторов автоматически .
И лучше всего, из -за «синтаксиса экземпляра», «Синтаксис экземпляра». /> < /ul>
Таким образом, вы получаете преимущества инкапсуляции функций «не члена, не подругана» с удобством участников. Кажется мне лучшим из обоих миров; Сама библиотека .NET дает яркий пример в LINQ. Однако везде я смотрю, я вижу, как люди предупреждают о чрезмерном использовании метода расширения; Даже сама страница MSDN гласит: < /p>

В целом, мы рекомендуем вам реализовать методы расширения и только тогда, когда вам нужно. Функции утилиты списка (, BinarySearch , findIndex и т. Д.) Являются ли методы расширения ACME инкапсуляции и повторного использования кода, или я просто обманываю себя? (к более общему /функциональному C#) полезно или полезно ..) < /p>
edit3: переопределяемые методы расширения < /h3>
Единственная реальная проблема, идентифицированная до сих пор с этим подходом, заключается в том, что вы не можете специализировать методы расширения, если вам нужно. Я думал об этой проблеме, и я думаю, что придумал решение.

Предположим, у меня есть интерфейс myInterface , который я хочу расширить -
Я определяю свои методы расширения в myextension . Myextension Методы определяются в соответствии с этой шаблоном:

Код: Выделить всё

public static int MyMethod(this MyInterface obj, int arg, bool attemptCast=true)
{
if (attemptCast && obj is MyExtensionOverrider)
{
return ((MyExtensionOverrider)obj).MyMethod(arg);
}
// regular implementation here
}
Интерфейс переопределения отражает все методы, определенные в myextension , за исключением без параметров этого или perforce :
public interface MyExtensionOverrider
{
int MyMethod(int arg);
string MyOtherMethod();
}
< /code>
Теперь любой класс может реализовать интерфейс и получить функцию расширения по умолчанию: < /p>
public class MyClass : MyInterface { ... }
< /code>
Любой, кто хочет переопределить его с помощью конкретных реализаций, может дополнительно реализовать интерфейс переопределения: < /p>
public class MySpecializedClass : MyInterface, MyExtensionOverrider
{
public int MyMethod(int arg)
{
//specialized implementation for one method
}
public string MyOtherMethod()
{ // fallback to default for others
MyExtension.MyOtherMethod(this, attemptCast: false);
}
}
< /code>
И мы идем: методы расширения, предоставленные на интерфейсе, с опцией полной расширяемости при необходимости. Также общее, сам интерфейс не должен знать о расширении /переопределении, и множественные пары расширения /переопределения могут быть реализованы, не мешая друг другу. /> Это немного уродливое - реализация интерфейса переопределения включает в себя шаблон для каждой функции, которую вы Не Хотите специализироваться. Лучше всего получить, пока не появится языковая поддержка для интерфейсных функций. Мысли?

Подробнее здесь: https://stackoverflow.com/questions/303 ... eusability
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»