En förlängningsmetod i programmering är en metod som läggs till en befintlig klass ( typ ) på en annan plats än klassdeklarationsmodulen. Syntaktisk socker för en förlängningsmodul introducerades i C# 3.0 och VB.NET .
Tilläggsmetoden ska inte förväxlas med det arvsrelaterade begreppet metodtillägg ( eng. method extension ) som finns i CLOS , Smalltalk , Beta-språken, där superklassmetoden anropas före, under eller efter att klassmetoden är kallas [1] .
Följande exempel visar en förlängningsmetod definierad för klassen System.String (alias till sträng i C#). Observera att den är definierad i en icke-kapslad och icke-konfigurerbar statisk klass [2] :
namespace ExtensionMethods { public static class MyExtensions { // WordCount-metoden tar en sträng som indata, returnerar antalet ord, dvs. antalet delsträngar åtskilda av ett mellanslag, en punkt eller ett frågetecken. public static int WordCount ( denna sträng str ) { return str . Split ( nytt tecken [] { ' ' , '.' , '?' , '!' }, StringSplitOptions . RemoveEmptyEntries ). Längd ; } } } /* Tilläggsmetoden WordCount kommer att visas i omfattning om du inkluderar lämpligt namnområde: */ med ExtensionMethods ; /* Nu kan det kallas: */ string s = "Hello Extension Methods" ; int i = s . WordCount (); // jag kommer att ställas in på 3 int j = "Ät lite mer av de där mjuka franska bullarna och drick lite te." . WordCount (); // j kommer att ställas in på 10Jämfört med en vanlig metod är en extensionsmetod statisk, och den första parametern innehåller efter thismålklassen och målklassvariabeln, följt av metodparametrar [3] .
I C# har en förlängningsmetod endast tillgång till offentliga medlemmar i en klass. En annan begränsning är att om det finns både en inbyggd metod och en förlängning så har den inbyggda metoden företräde [3] .
Förlängningsmetoder används i stor utsträckning i LINQ . Till exempel är Select-satsen en förlängningsmetod för IEnumerable [4] -gränssnittet .
I Visual Basic .NET tillåter tilläggsmetoder utvecklare att lägga till nya funktioner till datatyper utan att härleda typer . En förlängningsmetod kan bara vara en procedur av formen Subeller Function, inte en egenskap, ett fält eller en händelse. Det första argumentet för metoden anger måldatatypen för tillägget. Förlängningsmetoder kan endast definieras inom moduler. Liksom i C# har en instansmetod företräde framför en förlängningsmetod, även om den senare har en mer exakt signatur [5] .
Ruby - språket har en funktion som liknar C# 3.0 som kallas "open class" ( eng. open class ) [6] .
klass TestClass def metod1 slut def method2 end end test = TestClass . nytt test . metod 1 test . metod2 klass TestClass def method3 end end testa . metod3Dessutom kan en förlängningsmetod inte läggas till hela klassen, utan bara till en specifik instans. Dessutom kan du i JRuby lägga till en metod till en klass från Java [6] . I Ruby, om det finns både en inbyggd metod och en tillägg, har den utökade metoden företräde.
I vanliga dynamiska språk ( JavaScript , Perl , Python , Ruby ) kan förlängningsmetodens mekanism för länge sedan implementeras (med alla försiktighetsåtgärder) genom " monkey patching " [7] .
Det finns fortfarande inga förlängningsmetoder i C++23 -standarden, men det finns en plats för dem - detta-parametrar [8] .