En udvidelsesmetode i programmering er en metode tilføjet til en eksisterende klasse ( type ) et andet sted end klassedeklarationsmodulet. Syntaktisk sukker til et udvidelsesmodul blev introduceret i C# 3.0 og VB.NET .
Udvidelsesmetoden må ikke forveksles med det arverelaterede koncept for metodeudvidelse ( eng. method extension ), der findes i CLOS , Smalltalk , Beta-sprogene, hvor superklassemetoden kaldes før, under eller efter, at klassemetoden er kaldet [1] .
Følgende eksempel viser en udvidelsesmetode, der er defineret for klassen System.String (aliaseret til streng i C#). Bemærk, at det er defineret i en ikke-indlejret og ikke-konfigurerbar statisk klasse [2] :
namespace ExtensionMethods { public static class MyExtensions { // WordCount-metoden tager en streng som input, returnerer antallet af ord, dvs. antallet af understrenge adskilt af et mellemrum, prik eller spørgsmålstegn. public static int WordCount ( denne streng str ) { return str . Split ( nyt tegn [] { ' ' , '.' , '?' , '!' }, StringSplitOptions . RemoveEmptyEntries ). Længde ; } } } /* Udvidelsesmetoden WordCount vises i omfang, hvis du inkluderer det passende navneområde: */ ved hjælp af ExtensionMethods ; /* Nu kan det kaldes: */ string s = "Hej udvidelsesmetoder" ; int i = s . WordCount (); // i vil blive sat til 3 int j = "Spis nogle flere af de bløde franske boller og drik noget te." . WordCount (); // j vil blive sat til 10Sammenlignet med en almindelig metode er en udvidelsesmetode statisk, og den første parameter indeholder efter thismålklassen og målklassevariablen, efterfulgt af metodeparametre [3] .
I C# har en udvidelsesmetode kun adgang til offentlige medlemmer af en klasse. En anden begrænsning er, at hvis der både er en indbygget metode og en udvidelse, har den indbyggede metode forrang [3] .
Udvidelsesmetoder er meget brugt i LINQ . For eksempel er Select-sætningen en udvidelsesmetode til IEnumerable [4] -grænsefladen .
I Visual Basic .NET giver udvidelsesmetoder udviklere mulighed for at tilføje nye funktioner til datatyper uden at aflede typer . En udvidelsesmetode kan kun være en procedure af formen Subeller Function, ikke en egenskab, et felt eller en begivenhed. Det første argument til metoden angiver måldatatypen for udvidelsen. Udvidelsesmetoder kan kun defineres inden for moduler. Som i C# har en instansmetode forrang frem for en udvidelsesmetode, selvom sidstnævnte har en mere præcis signatur [5] .
Ruby - sproget har en funktion, der ligner C# 3.0 kaldet "open class" ( eng. open class ) [6] .
klasse TestClass def metode1 slutning def method2 end end test = TestKlasse . ny test . metode 1 test . metode 2 klasse TestClass def method3 end end test . metode 3Derudover kan en udvidelsesmetode ikke tilføjes til hele klassen, men kun til en specifik instans. Desuden kan du i JRuby tilføje en metode til en klasse fra Java [6] . I Ruby, hvis der er både en indbygget metode og en udvidelse, har den udvidede metode forrang.
I almindelige dynamiske sprog ( JavaScript , Perl , Python , Ruby ) kan udvidelsesmetodemekanismen for længst implementeres (med alle forholdsregler) ved " abe-patching " [7] .
Der er stadig ingen udvidelsesmetoder i C++23 -standarden, men der er plads til dem - denne-parametre [8] .