Metoda de extindere

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] .

Implementare în C#

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] .

Implementare în Visual Basic .NET

Î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] .

Implementare în Ruby

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.

Implementare în alte limbi

Î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] .

Note

  1. Gardner, 2002 , p. 63.
  2. Metode de extensie (Ghid de programare C#) . Consultat la 15 februarie 2012. Arhivat din original pe 17 februarie 2012.
  3. 1 2 Liberty, Xie, 2007 .
  4. Metode de extensie C# . Data accesului: 20 septembrie 2014. Arhivat din original la 24 septembrie 2014.
  5. Bai, 2012 .
  6. 1 2 Neal Ford, Clasele deschise sunt rele? Arhivat pe 4 martie 2016 la Wayback Machine , 2007
  7. Monkeypatching For Humans Arhivat 6 septembrie 2014 la Wayback Machine , Jeff Atwood, 2008
  8. Deducerea acestui lucru

Literatură

  • Liberty, J. și Xie, D. Programare C# 3.0. - O'Reilly Media, 2007. - P. 294-297. — 608 p. — ISBN 9780596554880 .
  • Papa, J. Data-Driven Services with Silverlight 2. - O'Reilly Media, 2008. - P. 12-14. — 368 p. — ISBN 9780596554422 .
  • Gardner, TA Relații de moștenire pentru construcția de software disciplinată. - Springer, 2002. - ISBN 9781852334673 .
  • Bai, Y. Programare practică a bazelor de date cu Visual Basic.NET. - Wiley, 2012. - P. 229-232. — 900p. — ISBN 9781118249826 .

Link -uri