Метод расширения

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск

Метод расширения (англ. extension method) в программировании — синтаксический сахар, для поддержки добавления метода к существующему классу. Введён в C# 3.0. Упрощает модификацию сторонних классов. Аналогичен использованию интерфейсов, но при этом не требует (не должен требовать) наследования изменяемого класса от интерфейса. Фактически — вид делегирования.

Синтаксис C#[править | править исходный текст]

/* Следующий пример показывает метод расширения, определённый для класса System.String (в языке C# имеет псевдоним string). 
Заметим, что он определён внутри невложенного и ненастраиваемого статичного класса: */
namespace ExtensionMethods
{
    public static class MyExtensions
    {
        // метод WordCount принимает на вход строку, возвращает число слов, т.е. число подстрок, разделённых пробелом, точкой или вопросительным знаком.
        public static int WordCount(this string str)
        {
            return str.Split(new char[] { ' ', '.', '?' }, 
                             StringSplitOptions.RemoveEmptyEntries).Length;
        }
    }   
}
 
/* Метод-расширение WordCount появится в области видимости, если подключить соответствующее пространство имён: */
using ExtensionMethods;
 
/* Теперь его можно вызвать: */
string s = "Hello Extension Methods";
int i = s.WordCount(); // i получит значение 3
int j = "Съешь же ещё этих мягких французских булок, да выпей чаю.".WordCount(); // j получит значение 10

Код взят: http://msdn.microsoft.com/en-us/library/bb383977.aspx

В C#, если есть и встроенный метод, и расширение, приоритет даётся встроенному методу.

Синтаксис Ruby[править | править исходный текст]

class TestClass
  def method1
  end
 
  def method2
  end
end
 
test = TestClass.new
test.method1
test.method2
 
class TestClass
  def method3
  end
end
 
test.method3

В Ruby, если есть и встроенный метод, и расширение, приоритет дается расширенному методу.

Отличие от наследования[править | править исходный текст]

Наследование Метод расширения
Практически неприменимо на чужих фреймворках и чужом коде со сложной структурой Применимо к любому коду
Применимо только к объектам, от которых можно наследовать Применимо к объектам любого типа (в том числе sealed, коим является int или string в C#)
Бывает виртуальным Не бывает виртуальным