Generalización y especialización: herencia

La generalización es la propiedad que permite compartir información entre dos entidades evitando la redundancia.

En el comportamiento de objetos existen con frecuencia propiedades que son comunes en diferentes objetos y esta propiedad se denomina generalización.

Por ejemplo, máquinas lavadoras, frigoríficos, hornos de microondas, tostadoras, lavavajillas, etc., son todos electrodomésticos (aparatos del hogar).

En el mundo de la orientación a objetos, cada uno de estos aparatos es un subclase de la clase Electrodoméstico y a su vez Electrodoméstico es una superclase de todas las otras clases (máquinas lavadoras, frigoríficos, hornos de microondas, tostadoras, lavavajillas,).

El proceso inverso de la generalización por el cual se definen nuevas clases a partir de otras ya existentes se denomina especialización.
Representación de clases en UML con atributos y métodos

En orientación a objetos, el mecanismo que implementa la propiedad de generalización se denomina herencia.

La herencia permite definir nuevas clases a partir de otras clases ya existentes, de modo que presentan las mismas características y comportamiento de éstas, así como otras adicionales.

La idea de clases conduce a la idea de herencia. Clases diferentes se pueden conectar unas con otras de modo jerárquico.

Las relaciones de generalización y especialización, en nuestras vidas diarias se utiliza el concepto de clases divididas en subclases.

La clase animal se divide en anfibios, mamíferos, insectos, pájaros, etc., y la clase vehículo en carros, motos, camiones, buses, etc.

El principio de la división o clasificación es que cada subclase comparte características comunes con la clase de la que procede o se deriva.

Los carros, motos, camiones y buses tiene ruedas, motores y carrocerías; son las características que definen a un vehículo. Además de las características comunes con los otros miembros de la clase, cada subclase tiene sus propias características.

Por ejemplo los camiones tienen una cabina independiente de la caja que transporta la carga; los buses tienen un gran número de asientos independientes para los viajeros que ha de transportar, etc.

De modo similar una clase se puede convertir en padre o raíz de otras subclases. En C++ la clase original se denomina clase base y las clases que se derivan de ella se denominan clases derivadas y siempre son una especialización o concreción de su clase base.

A la inversa, la clase base es la generalización de la clase derivada.

Esto significa que todas las propiedades (atributos y operaciones) de la clase base se heredan por la clase derivada, normalmente suplementada con propiedades adicionales.
Herencia de clases en UML