Herencia (programación orientada a objetos)


En la programación orientada a objetos , la herencia es el mecanismo de basar un objeto o clase en otro objeto ( herencia basada en prototipos ) o clase ( herencia basada en clases ), conservando una implementación similar . También se define como derivar nuevas clases ( subclases ) de las existentes, como superclase o clase base, y luego formarlas en una jerarquía de clases. En la mayoría de los lenguajes orientados a objetos basados ​​en clases, un objeto creado a través de la herencia, un "objeto hijo", adquiere todas las propiedades y comportamientos del "objeto padre", con la excepción de: constructores , destructor,operadores sobrecargados y funciones amigas de la clase base. La herencia permite a los programadores crear clases que se basan en clases existentes, [1] para especificar una nueva implementación manteniendo los mismos comportamientos ( realizando una interfaz ), reutilizar código y extender de forma independiente el software original a través de clases e interfaces públicas . Las relaciones de objetos o clases a través de la herencia dan lugar a un grafo acíclico dirigido .

La herencia se inventó en 1969 para Simula [2] y ahora se utiliza en muchos lenguajes de programación orientados a objetos como Java , C ++ , PHP y Python .

Una clase heredada se denomina subclase de su clase padre o superclase. El término "herencia" se utiliza de forma flexible tanto para la programación basada en clases como para la programación basada en prototipos, pero en un uso limitado, el término está reservado para la programación basada en clases (una clase hereda de otra), siendo la técnica correspondiente en la programación basada en prototipos en su lugar se llama delegación (un objeto delega a otro).

La herencia no debe confundirse con la subtipificación . [3] [4] En algunos idiomas, la herencia y el subtipo concuerdan, [a] mientras que en otros difieren; en general, el subtipo establece una relación es-a , mientras que la herencia solo reutiliza la implementación y establece una relación sintáctica, no necesariamente una relación semántica (la herencia no asegura el subtipo de comportamiento). Para distinguir estos conceptos, el subtipo a veces se denomina herencia de interfaz (sin reconocer que la especialización de las variables de tipo también induce una relación de subtipo), mientras que la herencia, tal como se define aquí, se conoce como herencia de implementación o herencia de código.. [5] Aún así, la herencia es un mecanismo comúnmente utilizado para establecer relaciones de subtipo. [6]

La herencia se contrasta con la composición de objetos , donde un objeto contiene otro objeto (o los objetos de una clase contienen objetos de otra clase); ver composición sobre herencia . La composición implementa una relación tiene-a , en contraste con la relación es-a de subtipificación.

"La herencia múltiple  ... se suponía que era muy difícil de implementar de manera eficiente. Por ejemplo, en un resumen de C ++ en su libro sobre Objective C , Brad Cox en realidad afirmó que agregar herencia múltiple a C ++ era imposible. Por lo tanto, la herencia múltiple parecía Más que un desafío. Ya que había considerado la herencia múltiple ya en 1982 y encontré una técnica de implementación simple y eficiente en 1984, no pude resistir el desafío. Sospecho que este es el único caso en el que la moda afectó la secuencia de eventos . " [8]


Herencia única
Herencia múltiple
Herencia multinivel
Ilustración de anulación de método