La anulación de métodos se usa en la programación orientada a objetos dentro de una jerarquía de herencia y ocurre cuando un método definido en una superclase se redefine en una subclase. Por lo general, el método de subclase hace algo diferente al método de superclase o amplía una capacidad de la superclase, pero este no tiene por qué ser el caso. La anulación de método se produce siempre que se redefine un método de superclase en una subclase, independientemente del contenido del método redefinido. Las firmas del método redefinido deben ser exactamente las mismas.
Por ejemplo, una clase A puede contener un método llamado «hacer algo» y este método no toma parámetros de entrada. Además, las clases B y C pueden ser subclases de la clase A. La clase B puede contener un método llamado «doSomething», que no toma parámetros de entrada, y la clase C puede contener un método «doSomething» que toma un número como parámetro de entrada. En este ejemplo, solo la clase B demostraría la invalidación del método, porque su método «doSomething» tiene la misma firma de método que su superclase, la clase A. El método «doSomething» en la clase C, por otro lado, demuestra la sobrecarga de métodos porque crea un método completamente nuevo.
La herencia virtual en C ++ es otro ejemplo de anulación de métodos. Los métodos virtuales en superclases pueden implementarse o no, pero cualquier definición de subclase de ellos es una instancia de anulación de métodos. Cuando se invalida un método en una subclase, no se llama al método de la superclase a menos que se invoque explícitamente. A menudo se dice que esta forma específica de llamar a un método anulado «oculta» la implementación de la superclase.
Aunque la anulación de métodos es muy flexible, no todos los métodos pueden anularse y hay ocasiones en las que esta rigidez puede ser preferible. Tanto en Java como en C ++, se pueden aplicar palabras clave específicas en las firmas de métodos para evitar que un método se anule en una subclase. Para hacer esto, Java usa la palabra clave «final» y C ++ usa la palabra clave «const». La prevención de la invalidación del método puede resultar beneficiosa si una función en particular no debe modificarse en todo el árbol de herencia.
En general, no es necesario anular los métodos simples que obtienen pequeños fragmentos de datos. Los casos que tienden a beneficiarse más de la anulación son cuando una subclase tiene como objetivo agregar funcionalidad a un método de superclase sin crear un método completamente nuevo para hacerlo. Los casos inusuales en los que un método debe rehacerse por completo para un tipo específico de objeto también pueden beneficiarse de esta técnica. Siempre que se anula un método, es importante que el programador comente adecuadamente los métodos de superclase y subclase. Idealmente, estos comentarios deberían aclarar qué hace cada variante del método, así como cómo y por qué difieren.