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
