Conceptos básicos de la POO - Parte 6
Herencia
Al igual que la agregación, la herencia hace posible la "construcción" de objetos progresivamente más complejos al permitir que las características definidas en una clase sean heredadas por otras.
La herencia, que es la implementación de la abstracción de especialización que se explicó anteriormente, es una de las características que más se suelen destacar de la programación orientada a objetos, mediante la que es posible crear jerarquías de clases.
Las clases pertenecientes a los niveles más altos proveen todas sus características a alguna clase en el nivel inmediato inferior.
Una clase en un nivel más alto (más abstracto) se denomina superclase y las clases que de ella se derivan, en el nivel inmediato inferior, son sus subclases. También es frecuente denominarlas como clases ancestra y clases descendientes o clase padre y clase hijas.
Como puede ver en la figura, la clase raíz de la jerarquía no tiene una superclase y las clases en el nivel más bajo de la jerarquía no son superclases de ninguna otra, pero es fácil ampliarla añadiéndole subclases.
Observe que no existe un soporte explícito para la "generalización". En efecto, si durante el desarrollo de un programa se identifica que dos clases comparten cierto comportamiento y atributos con una semántica equivalente, es decir, se cae en la cuenta de que ambas clases deberían derivar de una tercera, se deberá crear una clase (la superclase), que encapsule los comportamientos y atributos compartidos, y modificar las clases originales para que hereden de la nueva (super) clase. Es decir, que la forma de implementar la generalización es la creación de una nueva superclase y la aplicación del "mecanismo" de herencia (especialización) a las clases modificadas.
El tipo de herencia que admite Gambas se denomina herencia simple. Esto significa que una subclase sólo puede heredar de una superclase. Así es como fue pensada originalmente la herencia en el paradigma de programación orientada a objetos (durante el desarrollo de Simula y luego de Smalltalk) y como la mayoría de los lenguajes la implementa, pero hay lenguajes que excepcionalmente permiten herencia múltiple. En efecto, ya que el paradigma de objetos lleva la pretensión de hacer el desarrollo de software más simple y por ello más robusto y fiable en comparación con el estilo de programación modular y estructurada, adopta el "mecanismo" de herencia simple para evitar problemas que pueden llegar a ser realmente muy engorrosos.
Paradójicamente C++, el lenguaje que más contribuyó a la adopción masiva del paradigma de objetos, soporta herencia múltiple, al igual que otros lenguajes como Eiffel y Python. Pero el abordaje que Gambas hace de la herencia es el que se apoya en la simplicidad.
La palabra clave mediante la que se define una subclase en Gambas es INHERITS (hereda).
'Clase Notebook INHERITS OrdenadorPortatil
Cuando se escribe una clase que deriva de otra (su superclase) generalmente se hace así para crear una categoría de objetos que posea el comportamiento de la superclase, pero se busca también que esa nueva clase añada o modifique parte de ese comportamiento (de lo contrario la clase hija sería igual que la clase padre, lo que no tendría mucho sentido).
Para añadir comportamiento a la subclase tan sólo se deben definir nuevos métodos (y ello generalmente requerirá definir nuevos atributos). En cambio, para modificar un comportamiento se debe redefinir el método correspondiente de la superclase, es decir, escribir un método con la misma firma pero con un comportamiento diferente.
También es posible añadir o redefinir atributos, propiedades o eventos, cuestiones que se abordarán un poco más adelante.
Los comentarios están habilitados para que los lectores puedan participar en la corrección del libro, realizar preguntas puntuales o sugerencias. Todo comentario fuera de estos objetivos será eliminado. Por favor, tenga en cuenta lo siguiente:
- Cumpla las normas de etiqueta.
- Realice críticas constructivas.
- No sea redundante.