onsdag 19 september 2007

ClassMate 3 (Extension Methods C#3.0)

Jag är helt frälst i C# 3.0 tilläget "Extension Methods". Ska förklara lite snabbt vad det innebär.

I objektorienterade världen så är vi vana vid arv och polymorfism. Vi har en basklass A som sedan B och C ärver ifrån. B och C är nu subklasser till A. De ärver alla publika egenskaper och metoder från A. Vi kan nu utöka funktionaliteten i B och C med nya metoder och egenskaper. Vi kan även förändra beteende av befintliga ärvda metoder och egenskaper från A genom s.k polymorfism. Allt detta vet ni OO programmerare om, gammalt som gatan.

Ibland kan det ändå kännas lite overkill att ärva en klass för att lägga till någon enstaka metod. Eller vissa klasser går inte att ärva ifrån eftersom de är förseglade (sealed). Då kommer extension methods in i bilden. Med den metodiken kan man nämligen "injicera" metoder i befintliga klasser utan att ärva eller förändra klasserna. Det går även att utföra denna injicering på förseglade klasser som t ex string klassen. Idén har funnits länge och vi hittar delar av denna metodik i bl.a programspråken Eiffel och Smalltalk där det kallas Mixin. Här är ett exempel där jag lägger till en metod "ToVoice" som får datorn att "tala ut" den sträng som man jobbar med. Extension metoden ser ut så här:



Observera att metoden måste vara static i en static class. Hemlighetet ligger i metodens parametara ser vi nyckelordet "this", det är detta nyckelord tillsammans med den statiska deklarationen som gör metoden till en extension method. Nu kan vi använda denna metod på vilket sträng objekt som helst precis som om det var med i strängklassen från början. Tex så här:



Denna kod kommer att dels printa ut alla kataloger på C: och deras ändringsdatum, men datorn kommer även att "prata" och säga namnet på katalogen och ändringsdatumet. Kanske användbart vad vet jag. Men det är ett exempel på en extension method. Som vanligt kod skickas på begäran.