Metoda rozšíření v programování je metoda přidaná k existující třídě ( type ) na jiném místě, než je modul deklarace třídy . Syntaktický cukr pro rozšiřující modul byl představen v C# 3.0 a VB.NET .
Metoda rozšíření by neměla být zaměňována s konceptem rozšíření metody souvisejícím s dědičností ( angl. method extension ), který existuje v jazycích CLOS , Smalltalk , Beta, ve kterých je metoda nadtřídy volána před, během nebo po tom, co je metoda třídy s názvem [1] .
Následující příklad ukazuje metodu rozšíření definovanou pro třídu System.String (přiřazená řetězci v C#). Všimněte si, že je definována uvnitř nevnořené a nekonfigurovatelné statické třídy [2] :
jmenný prostor ExtensionMethods { public static class MyExtensions { // metoda WordCount bere jako vstup řetězec, vrací počet slov, tzn. počet podřetězců oddělených mezerou, tečkou nebo otazníkem. public static int WordCount ( tento řetězec str ) { return str . Rozdělit ( nový znak [] { ' ' , '.' , '?' , '!' }, StringSplitOptions . RemoveEmptyEntries ). Délka ; } } } /* Metoda rozšíření WordCount se objeví v rozsahu, pokud zahrnete příslušný jmenný prostor: */ using ExtensionMethods ; /* Nyní to lze volat: */ string s = "Hello Extension Methods" ; int i = s . Počet slov (); // i bude nastaveno na 3 int j = "Jezte ještě trochu těch měkkých francouzských buchet a dejte si čaj." . Počet slov (); // j bude nastaveno na 10Ve srovnání s běžnou metodou je metoda rozšíření statická a první parametr obsahuje za thiscílovou třídou a proměnnou cílové třídy, následují parametry metody [3] .
V C# má metoda rozšíření přístup pouze k veřejným členům třídy. Dalším omezením je, že pokud existuje jak vestavěná metoda, tak rozšíření, má přednost vestavěná metoda [3] .
Metody rozšíření jsou široce používány v LINQ . Například příkaz Select je metodou rozšíření rozhraní IEnumerable [4] .
Ve Visual Basic .NET umožňují metody rozšíření vývojářům přidávat nové funkce k datovým typům bez odvozování typů . Metodou rozšíření může být pouze procedura formuláře Subnebo Function, nikoli vlastnost, pole nebo událost. První argument metody určuje cílový datový typ pro rozšíření. Metody rozšíření lze definovat pouze v rámci modulů. Stejně jako v C# má metoda instance přednost před metodou rozšíření, i když ta má přesnější podpis [5] .
Jazyk Ruby má vlastnost podobnou C# 3.0 nazvanou "otevřená třída" ( anglicky open class ) [6] .
class TestClass def metoda1 konec def metoda2 end end test = TestClass . nový test . metoda1 test . metoda2 class TestClass def metoda3 end end test . metoda3Navíc metodu rozšíření lze přidat nikoli do celé třídy, ale pouze do konkrétní instance. Navíc v JRuby můžete přidat metodu do třídy z Javy [6] . Pokud v Ruby existuje jak vestavěná metoda, tak rozšíření, má přednost rozšířená metoda.
V běžných dynamických jazycích ( JavaScript , Perl , Python , Ruby ) lze mechanismus rozšiřovací metody již dávno implementovat (se všemi opatřeními) „ opičím záplatováním “ [7] .
Ve standardu C++23 ještě nejsou žádné rozšiřující metody , ale místo pro ně je - this-parameters [8] .