En los lenguajes de programación orientada a objetos, el problema del diamante es una ambigüedad que surge cuando dos clases B y C heredan de A, y la clase D hereda de B y C. Si un método en D llama a un método definido en A, ¿por qué clase lo hereda, B o C?
Por ejemplo, en el contexto del desarrollo de software GUI, una clase Botón
puede heredar de las clases Rectángulo
(para la apariencia) y Ratón
(para los eventos de ratón), y las clases Rectángulo
y Botón
heredan a su vez de la clase Objeto
. Si ahora el método EsIgualA
es llamado para un objeto Botón
y ese método no está definido en la clase Botón
pero sí para Rectángulo
y también para Ratón
, ¿cuál de los dos métodos debería ser finalmente llamado?
Se llama el problema del 'diamante' por la forma del diagrama de herencia de clase en esta situación. La clase A está arriba, B y C están separadas debajo de ella, y D se une a las dos en la parte inferior consiguiendo la forma de un diamante.
Diferentes lenguajes de programación tratan este problema de maneras diferentes:
Lenguajes que sólo permiten herencia simple (como Objective-C, PHP, C#, y Java) permiten la herencia múltiple de interfaces (llamadas protocolos en Objective-C). Las interfaces son esencialmente clases base abstractas con todos los métodos abstractos y sin miembros de datos. El problema es por tanto evitado ya que siempre hay sólo una implementación para un método o propiedad específico y no surge ninguna ambigüedad.
El problema del diamante no está limitado a herencia. También surge cuando archivos de cabecera A, B, C y D incluyen ("#include") los unos a los otros en un diamante como arriba y cabeceras precompiladas separadas son creadas desde B y C. Si estas dos cabeceras precompiladas son combinadas, las declaraciones en A son duplicadas y la convención "#ifndef" no es efectiva. También se encuentra al componer pilas de middleware; por ejemplo, si A es una base de datos y B y C son cachés, D puede pedir tanto a B como a C la confirmación de una transacción, dando lugar a llamadas de confirmación a A duplicadas.
Escribe un comentario o lo que quieras sobre Problema del diamante (directo, no tienes que registrarte)
Comentarios
(de más nuevos a más antiguos)