O metodă de extensie în programare este o metodă adăugată la o clasă existentă ( tip ) într-un alt loc decât modulul de declarare a clasei. Zahărul sintactic pentru un modul de extensie a fost introdus în C# 3.0 și VB.NET .
Metoda extensiei nu trebuie confundată cu conceptul legat de moștenire de extensie a metodei ( extensia metodei ing. ) care există în limbajele CLOS , Smalltalk , Beta, în care metoda superclasei este apelată înainte, în timpul sau după ce metoda clasei este numit [1] .
Următorul exemplu arată o metodă de extensie definită pentru clasa System.String (aliasată la șir în C#). Rețineți că este definit în interiorul unei clase statice neimbricate și neconfigurabile [2] :
namespace ExtensionMethods { public static class MyExtensions { // Metoda WordCount ia ca intrare un șir, returnează numărul de cuvinte, adică. numărul de subșiruri separate de un spațiu, punct sau semn de întrebare. public static int Număr de cuvinte ( acest șir str ) { return str . Split ( caracter nou [] { ' ' , '.' , '?' , '!' }, StringSplitOptions . RemoveEmptyEntries ). lungime ; } } } /* Metoda de extensie WordCount va apărea în domeniu dacă includeți spațiul de nume corespunzător: */ utilizând ExtensionMethods ; /* Acum poate fi numit: */ string s = "Hello Extension Methods" ; int i = s . Număr de cuvinte (); // i va fi setat la 3 int j = "Mănâncă niște chifle franțuzești moi și bea niște ceai." . Număr de cuvinte (); // j va fi setat la 10În comparație cu o metodă obișnuită, o metodă de extensie este statică, iar primul parametru conține după thisclasa țintă și variabila clasa țintă, urmate de parametrii metodei [3] .
În C#, o metodă de extensie are acces numai la membrii publici ai unei clase. O altă limitare este că dacă există atât o metodă încorporată, cât și o extensie, metoda încorporată are prioritate [3] .
Metodele de extensie sunt utilizate pe scară largă în LINQ . De exemplu, instrucțiunea Select este o metodă de extensie a interfeței IEnumerable [4] .
În Visual Basic .NET , metodele de extensie permit dezvoltatorilor să adauge noi caracteristici la tipurile de date fără a deriva tipuri . O metodă de extensie poate fi doar o procedură de formă Subsau Function, nu o proprietate, câmp sau eveniment. Primul argument al metodei specifică tipul de date țintă pentru extensie. Metodele de extensie pot fi definite numai în cadrul modulelor. Ca și în C#, o metodă de instanță are prioritate față de o metodă de extensie, chiar dacă aceasta din urmă are o semnătură mai precisă [5] .
Limbajul Ruby are o caracteristică similară cu C# 3.0 numită „open class” ( ing. open class ) [6] .
clasa TestClass def method1 end def method2 end end test = TestClass . nou test . metoda 1 test . metoda 2 clasa TestClass def method3 end end test . metoda 3În plus, o metodă de extensie poate fi adăugată nu la întreaga clasă, ci doar la o anumită instanță. Mai mult, în JRuby puteți adăuga o metodă la o clasă din Java [6] . În Ruby, dacă există atât o metodă încorporată, cât și o extensie, metoda extinsă are prioritate.
În limbajele dinamice obișnuite ( JavaScript , Perl , Python , Ruby ), mecanismul metodei de extensie poate fi implementat cu mult timp în urmă (cu toate precauțiile) prin „ patching maimuță ” [7] .
Nu există încă metode de extensie în standardul C++23 , dar există un loc pentru ele - this-parameters [8] .