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 superclases o clases 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 secundario", adquiere todas las propiedades y comportamientos del "objeto principal", 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 ( creando una interfaz ), para reutilizar el 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 usa en muchos lenguajes de programación orientados a objetos como Java , C++ , PHP y Python .

Una clase heredada se denomina subclase de su clase principal o superclase. El término "herencia" se usa libremente tanto para la programación basada en clases como para la basada en prototipos, pero en un uso limitado, el término se reserva 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, la subtipificación establece una relación es-un , 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 la subtipificación de comportamiento). Para distinguir estos conceptos, la subtipificación 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 subtipificación), 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 (u objetos de una clase contienen objetos de otra clase); ver composición sobre herencia . La composición implementa una relación tiene-un , en contraste con la relación es-un de la subtipificación.

"Se suponía ampliamente que la herencia múltiple  ... 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 la herencia múltiple a C++ era imposible. Por lo tanto, la herencia múltiple parecía más de un desafío. Dado 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