Skip to main content

O que é substituição de método?

A substituição de método é usada na programação orientada a objetos dentro de uma hierarquia de herança e ocorre quando um método definido em uma superclasse é redefinido em uma subclasse. Normalmente, o método da subclasse faz algo diferente do método da superclasse ou expande a capacidade da superclasse, mas isso não precisa ser o caso. A substituição do método ocorre sempre que um método de superclasse é redefinido em uma subclasse, independentemente do conteúdo do método redefinido. As assinaturas de método redefinidas devem ser exatamente iguais.

Por exemplo, uma classe A pode conter um método chamado "doSomething", e esse método não usa parâmetros de entrada. Além disso, as classes B e C podem ser subclasses da classe A. A classe B pode conter um método chamado "doSomething", que não aceita parâmetros de entrada, e a classe C pode conter um método "doSomething" que aceita um número como parâmetro de entrada. Neste exemplo, apenas a classe B demonstraria a substituição do método, porque o método "doSomething" tem a mesma assinatura de método da superclasse, classe A. O método "doSomething" na classe C, por outro lado, demonstra a sobrecarga do método porque cria um método completamente novo.

A herança virtual em C ++ é outro exemplo de substituição de método. Os métodos virtuais nas superclasses podem ou não ser implementados, mas qualquer definição de subclasse deles é uma instância de substituição de método. Quando um método é substituído em uma subclasse, o método da superclasse não é chamado, a menos que seja chamado explicitamente. Diz-se frequentemente que essa maneira específica de chamar um método substituído "oculta" a implementação da superclasse.

Embora a substituição do método seja muito flexível, nem todos os métodos podem ser substituídos e há momentos em que essa rigidez pode ser preferível. Tanto em Java quanto em C ++, palavras-chave específicas podem ser aplicadas nas assinaturas de métodos para impedir que um método seja substituído em uma subclasse. Para fazer isso, Java usa a palavra-chave "final" e C ++ usa a palavra-chave "const". Impedir a substituição do método pode ser benéfico se uma função específica sempre deve ser inalterada em toda a árvore de herança.

Em geral, métodos simples que obtêm pequenos dados não precisam ser substituídos. Os casos que tendem a se beneficiar mais com a substituição são quando uma subclasse visa adicionar funcionalidade a um método de superclasse sem criar um método totalmente novo para isso. Casos incomuns em que um método precisa ser completamente refeito para um tipo específico de objeto também podem se beneficiar dessa técnica. Sempre que um método é substituído, é importante para o programador comentar adequadamente os métodos de superclasse e subclasse. Idealmente, esses comentários devem esclarecer o que cada variante do método faz, bem como e por que eles diferem.