A substituição de método é um recurso importante do OOP que permite reescrever uma função ou método de classe base com uma definição diferente. A substituição também é conhecida como “polimorfismo dinâmico” porque a substituição é resolvida no tempo de execução. Aqui a assinatura do método ou função deve ser a mesma. Já quando falamos de método sombra ou shadow method, um método ou função da classe base está disponível para a classe filho (derivada) sem o uso da palavra-chave “override”.
Isto é, o compilador oculta a função ou método da classe base. Esse conceito é conhecido como sombreamento ou ocultação de método. Na sombra ou ocultação do método, a classe derivada (child) tem sua própria versão da função, a mesma função também está disponível na classe base. De uma forma resumida a técnica shadow permite que eu tenha dois métodos com a mesma assinatura, utilizando herança de classes, porém podendo escolher qual implementação eu irei utilizar, se é da classe filha ou da classe mãe.
Em relação aos exemplos e explicação sobre override, você pode acompanhar em: Diferenças entre Overload e Override com c# . Porém irei colocar um breve exemplo aqui:
//Overriding public class teste { public virtual void obtemInfo(int id) { //Obtem info padrão } } public class teste2 : teste { public override void obtemInfo(int id) { //base.obtemInfo(id); //ou - Obtem info em uma nova implementação } }
Veja agora um exemplo do mesmo código acima, utilizando a técnica shadow:
//Overriding public class teste { public virtual void obtemInfo(int id) { //Obtem info padrão } } public class teste2 : teste { public new void obtemInfo(int id) { //base.obtemInfo(id); //ou - Obtem info em uma nova implementação } } //program.cs static void Main(string[] args) { var a = new teste(); var b = new teste2(); Console.WriteLine(a.obtemInfo()); Console.WriteLine(b.obtemInfo()); }
Sombreamento versus substituição
Shadow | Override |
Shadowing é um conceito muito famoso em VB.Net. Também conhecido como método oculto em C#. Usando esse conceito, podemos fornecer uma nova implementação para o método da classe base sem substituí-lo. | A substituição nos permite reescrever uma função de classe base com uma definição diferente. |
Usando a palavra-chave “new”, podemos fazer a sombra ou ocultar o método. | O C# usa a palavra-chave virtual / abstract e override para substituir o método. |
A sombra redefine um método ou função inteira. | A substituição redefine apenas a implementação de um método ou função. |
Nós podemos mudar o modificador de acesso. | Não podemos alterar o modificador de acesso. O modificador de acesso deve ser o mesmo que no método ou função da classe base. |
Não há controle de uma classe base no sombreamento. Em outras palavras, um elemento de classe base não pode impor ou parar de sombreamento. | A classe base tem algum controle sobre a substituição. Usando a palavra-chave abstract, a classe base força a classe child (derivada) a implementar a função ou o método. |
Na sombra, a assinatura de um elemento pode ser diferente. | Na substituição, a assinatura do elemento deve ser a mesma. |
Espero que você tenha entendo um pouco mais sobre OOP com c#. Caso você queira brincar com shadow e override, você pode acessar este fiddle aqui.
Um abraço a todos! 🙂
Fontes: https://stackoverflow.com/questions/392721/difference-between-shadowing-and-overriding-in-c