‒ Herencia - Polimorfismo por sobre-escritura - Compatibilidad entre objetos.
La herencia es una característica, que permite que una clase nueva se pueda crear a partir de otra existente. La herencia permite que una clase nueva contenga los métodos y atributos de otra clase, a la clase nueva generalmente se le llama subclase y la clase del cual se heredan sus métodos y atributos se le suele llamar clase primaria o clase padre.
La ventaja de la herencia es la posibilidad de definir atributos y métodos nuevos para las subclases que se crean, que luego se pueden usar con los métodos y atributos heredados de la clase padre.
Además una subclase puede ser usada como clase padre para crear otras clases, y estas a su vez también se pueden usar como clases padres, y de ese modo se puede crear una jerarquía de clases especializada. En donde se denomina superclase a la clase que es el inicio de una jerarquía de clases. En freepascal, la herencia se indica al principio de la definición de una clase:
TReal = class(TComplejo)
End;
TReal es una clase que tiene exactamente los mismos métodos y atributos de la clase TComplejo. Los métodos, constructores y destructores de una clase padre pueden ser reemplazados o sobre-escritos por los métodos, constructores y destructores de una subclase, de ese modo se puede hacer que la subclase use los mismos métodos, constructores y destructores que la clase padre pero su comportamiento o funcionamiento será diferente. Cuando se sobre-escribe un método para cambiar el comportamiento de una subclase, entonces se dice que se está usando polimorfismo por sobre-escritura.
Para sobre-escribir un método o constructor, este debe tener el mismo nombre y la misma cantidad de parámetros, los parámetros pueden tener otro identificador y distinto tipo de dato.
A la clase TReal se le puede añadir un constructor con el mismo nombre que crear y un nuevo método ObtCad, que reemplaza ó sobre-escribe al método y constructor heredado de su clase padre. A continuación la implementación de la clase Real, que se debe guardar en el archivo Reales.pp:
A continuación el programa que usa las unidades Complejos y Reales:
Gracias al polimorfismo por sobre-escritura se ha logrado que los objetos que se crean de la clase TReal, interpreten adecuadamente el método ObtCad que es sobre-escrito por la clase TReal.
Cuando se sobre-escribe un método, se puede llamar al método, destructor o constructor anteriormente sobre-escrito, y para ello existe una palabra reservada inherited, que permite hacer esta tarea.
Inherited sin parámetro llama al constructor, destructor o método sobre-escrito con el mismo nombre del método que sobre-escribe al método heredado. Si este método tiene parámetros, usará los parámetros del método sobre-escrito.
Cuando tiene un nombre seguido después de inherited llama al método sobre-escrito sobrecargado con un nombre diferente.
Cuando se usa inherited con constructores, es recomendado usar inherited al inicio del código de un constructor y en el caso de destructores al final.
El siguiente programa es un ejemplo del uso de inherited: