Metoda rozšíření

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

Implementace v C#

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 10

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

Implementace ve Visual Basic .NET

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

Implementace v Ruby

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

Naví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.

Implementace v jiných jazycích

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

Poznámky

  1. Gardner, 2002 , str. 63.
  2. Metody rozšíření (C# Programming Guide) . Získáno 15. února 2012. Archivováno z originálu 17. února 2012.
  3. 1 2 Liberty, Xie, 2007 .
  4. Metody rozšíření C# . Datum přístupu: 20. září 2014. Archivováno z originálu 24. září 2014.
  5. Bai, 2012 .
  6. 1 2 Neal Ford, jsou otevřené třídy zlé? Archivováno 4. března 2016 na Wayback Machine , 2007
  7. Monkeypatching For Humans Archivováno 6. září 2014 na Wayback Machine , Jeff Atwood, 2008
  8. Toto odvodit

Literatura

  • Liberty, J. a Xie, D. Programování C# 3.0. - O'Reilly Media, 2007. - S. 294-297. — 608 str. — ISBN 9780596554880 .
  • Papa, J. Data-Driven Services with Silverlight 2. - O'Reilly Media, 2008. - S. 12-14. — 368 s. — ISBN 9780596554422 .
  • Gardner, TA Dědické vztahy pro disciplinovanou konstrukci softwaru. - Springer, 2002. - ISBN 9781852334673 .
  • Bai, Y. Praktické databázové programování s Visual Basic.NET. - Wiley, 2012. - S. 229-232. — 900p. — ISBN 9781118249826 .

Odkazy