Uma característia presente nas linguagens de dinâmicas e que também está disponível na plataforma .NET, é a capacidade de extender uma classe sem a que seja necessário uma herança da mesma, o que seria impossível numa classe selada, que não permite que seja herdada.
Veja um exemplo em ruby (trecho retirado do artigo Micro Tutorial de Ruby – Parte I):
Veja um exemplo em ruby (trecho retirado do artigo Micro Tutorial de Ruby – Parte I):
class String def empty? self.nil? || self.size == 0 end end nome = "Sebastião Relson" nome.empty?
Veja como fica a saída do programa utilizando o IRB:
relson@lenny-amd64:~$ irb irb(main):001:0> class String irb(main):002:1> def empty? irb(main):003:2> self.nil? || self.size == 0 irb(main):004:2> end irb(main):005:1> end => nil irb(main):006:0> nome = "Sebastião Relson" => "Sebasti\303\243o Relson" irb(main):007:0> nome.empty? => false
Agora um exemplo em c# .NET:
using System; namespace MetodosExtensao { class MainClass { public static void Main(string[] args) { int i = 1; Console.WriteLine(i.Negativo()); } } static class ExtensoaInteiro { public static int Negativo(this int i) { return -i; } } }
Nesse exemplo a saída seria somente:
-1
Para facilitar a inserção do código no blog e deixar e exemplo mais simples coloquei as classes no mesmo arquivo. O código foi retirado com adaptações do livro Microsoft Visual C# 2008, Passo a Passo - John Sharp.
Para finalizar leia também o artigo de um grande amigo meu, o memorável Rafael Camargo que fala a respeito que também fala de métodos de extensão o artigo é C#: Extension Methods & Speech.