Herencia múltiple

La herencia múltiple  es una propiedad admitida por parte de los lenguajes de programación orientados a objetos , cuando una clase puede tener más de una superclase (clase principal directa), las interfaces admiten la herencia múltiple en muchos lenguajes de programación. Este concepto es una extensión de la "herencia simple (o única) " ( herencia única en inglés ), en la que una clase solo puede heredar de una superclase.  

Los lenguajes que admiten la herencia múltiple incluyen: Io , Eiffel , C++ , Dylan , Python , algunas implementaciones de clases de JavaScript (por ejemplo , dojo .declare), Perl 6 , Curl , Common Lisp (gracias a CLOS ), OCaml , Tcl (gracias a Incremental Tcl ) [1] , así como Object REXX (debido al uso de clases mixin ).

Resumen

La herencia múltiple permite que una clase herede la funcionalidad de muchas otras clases, como una clase StudentMusicianque puede heredar de class Person, class Musiciany class Worker, que se puede abreviar como:

StudentMusician : Person, Musician, Worker.

La incertidumbre en la herencia múltiple, como en el ejemplo anterior, ocurre si, por ejemplo, una clase Musicianhereda de las clases Persony Worker, y la clase Worker, a su vez, hereda de Person; una situación similar se llama herencia en forma de diamante . Así, obtenemos las siguientes reglas:

Trabajador  : Persona Músico  : Persona, Trabajador EstudianteMúsico  : Persona, Músico, Trabajador

Si el compilador está mirando la clase StudentMusician, entonces necesita saber si las características de las clases deben combinarse o separarse. Por ejemplo, sería lógico adjuntar la "Edad" (edad) de la clase Persona a la clase EstudianteMúsico. La edad de una persona no cambia si la consideras como Persona (persona), Obrero (trabajador) o Músico (músico). Sin embargo, sería bastante lógico separar la propiedad "Nombre" en las clases Persona y Músico si utilizan un nombre artístico diferente a su nombre real. Las opciones de unir y dividir son perfectamente válidas para cada uno de sus propios contextos, y solo el programador sabe qué opción es la correcta para la clase que se está diseñando.

Los lenguajes tienen varias formas de lidiar con tales problemas de herencia anidada, por ejemplo:

Smalltalk , C# , Objective-C , Java , Nemerle y PHP no permiten la herencia múltiple, lo que evita muchas incertidumbres. Sin embargo, además de Smalltalk, permiten que las clases implementen múltiples interfaces . Además, PHP y Ruby le permiten emular la herencia múltiple mediante el uso de mixins (rasgos en PHP y mixins en Ruby), que, al igual que las interfaces, no son clases completas. La herencia múltiple de interfaces le permite ampliar capacidades limitadas.

Crítica

La herencia múltiple ha sido criticada por los siguientes problemas en algunos lenguajes, en particular C++:

La herencia múltiple en lenguajes con constructores de estilo C++/Java exacerba el problema de la herencia de constructores y las secuencias de constructores, creando así problemas de mantenibilidad y extensibilidad en esos lenguajes. Los objetos en relaciones de herencia con métodos de construcción significativamente diferentes son bastante difíciles de implementar dentro del paradigma de la secuencia del constructor.

Sin embargo, hay lenguajes que manejan estos tecnicismos (por ejemplo, Eiffel ).

Existe la opinión de que la herencia múltiple es un concepto erróneo, generado por un análisis y diseño erróneos. En particular, la siguiente opción de diseño es válida para el ejemplo anterior. La clase Persona incluye uno o más objetos de la clase Profesión. Las clases Estudiante y Músico heredan de Profesión. Así, EstudianteMúsico estará representado por un objeto de clase Persona que contiene objetos de clase Estudiante y Músico. Formalmente, la herencia múltiple puede someterse a ingeniería inversa mediante la introducción de una clase que sea una "metaclase" de las clases a partir de las cuales se producirá la herencia múltiple. En el ejemplo anterior, tal metaclase es Profesión - una profesión.

Notas

  1. Defensa de Tcl . Consultado el 2 de diciembre de 2009. Archivado desde el original el 22 de septiembre de 2010.
  2. David M. Beazley. Referencia esencial de Python . — 4ª edición. - Addison-Wesley Professional, 2009. - S.  119 -122. — 717 pág. — ISBN 978-0672329784 .
  3. Manual Tcl: clase . Consultado el 2 de diciembre de 2009. Archivado desde el original el 4 de abril de 2009.
  4. Rasgos: Unidades Componibles de Comportamiento . Consultado el 2 de diciembre de 2009. Archivado desde el original el 9 de agosto de 2017.

Enlaces

Literatura