Existem inúmeras maneiras de realizar a mesma coisa quando se trata de programação, e navegando no stackoverflow me deparei com uma questão que me instigou a escrever este artigo. Hoje iremos ver a diferença entre a sobrecarga de método e a substituição de método (Override e Overload) pois a diferença entre eles é um conceito importante para se termos em mente.
Assim, vamos primeiro entender. O que é sobrecarga de método (overload)
Utilizar a sobrecarga nos permite criar mais de um método ou função que tem o mesmo nome, mas assinaturas ou parâmetros diferentes na mesma classe. Isto é chamado de sobrecarga de método. Veja alguns pontos importantes
- A sobrecarga de método também é chamada de polimorfismo de ligação antecipada ou ligação estática ( early binding polymorphism or static binding ).
- O compilador chama automaticamente o método ou a função necessária, verificando o número de parâmetros e seu tipo, que são passados para esse método.
- Se o número de parâmetros e tipo não corresponder a nenhuma assinatura de método, ocorrerá o erro de tempo de compilação.
- Podemos obter sobrecarga de método alterando o número de parâmetros usados ou usando diferentes tipos de parâmetros ou alterando a ordem dos parâmetros.
- Com isto o compilador se encarrega de verificar a existência e coerência de diferentes métodos com o mesmo nome, alterando apenas a quantidade ou tipos de parâmetros necessários.
//Overloading public class teste { public void obtemInfo(int id) { //método 1 } public void obtemInfo(string nome) { //método 2 } public void obtemInfo(string nome, bool ativo) { //método 3 } }
Agora que vimos overload, vamos ver O que é substituição de método (override)
Com o override, podemos criar um método em uma classe derivada com a mesma assinatura e mesmo nome que um método na classe base. Isto é chamado de substituição de método ou ainda ter dois métodos com o mesmo nome e a mesma assinatura, um método na classe base e outro na classe derivada. Veja alguns pontos importantes:
- A substituição de método também é chamada de polimorfismo em tempo de execução ou ligação tardia (dynamic polymorphism or late binding).
- Podemos substituir um método na classe base, criando função semelhante na classe derivada. Isso pode ser alcançado usando herança e usando virtual & override.
- Falar que o método possui a mesma assinatura que o outro significa que os métodos devem ter o mesmo nome, o mesmo número de argumentos e o mesmo tipo de argumento.
- A substituição de método é possível apenas nas classes derivadas, mas não dentro da mesma classe por isto temos Overload ou Shadowing (que iremos ver em outro post).
- Quando a classe derivada precisa de um método com a mesma assinatura da classe base, mas deseja executar um código diferente daquele fornecido pela classe base, a substituição do método será usada.
//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 } }
Comparação entre sobrecarga de método e substituição de método.
# | Overload | Override |
1 | Criação de mais de um método ou função com o mesmo nome, mas com assinaturas ou parâmetros diferentes na mesma classe | Criação de um método na classe derivada com a mesma assinatura que um método na classe base. |
2) | É chamado de polimorfismo em tempo de compilação | É chamado polimorfismo de tempo de execução |
3) | Ele tem o mesmo nome de método, mas com assinaturas ou parâmetros diferentes | Ele deve ter o mesmo nome do método, bem como as assinaturas ou os parâmetros. |
4) | Sobrecarga de método não precisa de herança | A substituição de método precisa de herança |
5) | Sobrecarga de método é possível apenas em classe única | A substituição do método precisa do nível hierárquico das classes, ou seja, uma classe pai e outra classe filho. |
6 | O modificador de acesso pode ser qualquer um. | O modificador de acesso deve ser público. |
7) | A sobrecarga de método também é chamada de ligação antecipada. | A substituição de método também é chamada de ligação tardia. |
Ou seja, a diferença de overload ou override varia muito em como você escreve o seu código, principalmente se você precisa de um método compartilhado com os mesmos paramêtros ou não. Espero que tenha ficado claro este assunto que é super utilizado no dia-a-dia de um programador.
Um abraço 🙂
Fontes: https://stackoverflow.com/questions/673721/overloading-and-overriding