(Nota: utilicé 'error' en lugar de 'problema' en el título por razones obvias ...;)).
Hice algunas lecturas básicas sobre Rasgos en Scala. Son similares a las interfaces en Java o C #, pero permiten la implementación predeterminada de un método.
Me preguntaba: ¿no puede esto causar un caso del "problema del diamante", razón por la cual muchos idiomas evitan la herencia múltiple en primer lugar?
Si es así, ¿cómo maneja Scala esto?
scala
multiple-inheritance
Aviv Cohn
fuente
fuente
Respuestas:
El problema del diamante es la incapacidad de decidir qué implementación del método elegir. Scala resuelve esto definiendo qué implementación elegir como parte de las especificaciones del lenguaje ( lea la parte sobre Scala en este artículo de Wikipedia ).
Por supuesto, la definición del mismo orden también podría usarse en la herencia múltiple de clase, entonces, ¿por qué molestarse con los rasgos?
La razón IMO es constructores. Los constructores tienen varias limitaciones que los métodos normales no tienen: solo se pueden invocar una vez por objeto, se deben invocar para cada nuevo objeto, y el constructor de una clase secundaria debe llamar al constructor de sus padres como su primera instrucción (la mayoría de los idiomas serán hágalo implícitamente si no necesita pasar parámetros).
Si B y C heredan A y D heredan B y C, y los constructores de B y C llaman al constructor de A, entonces el constructor de D llamará al constructor de A dos veces. Definir qué implementaciones elegir como hizo Scala con los métodos no funcionará aquí porque se debe llamar tanto a los constructores de B como de los de C.
Los rasgos evitan este problema ya que no tienen constructores.
fuente
Scala evita el problema del diamante mediante algo llamado "linealización de rasgos". Básicamente, busca la implementación del método en los rasgos que extiende de derecha a izquierda. Ejemplo simple:
Dicho esto, la lista de rasgos que busca puede contener más que los que usted proporcionó explícitamente, ya que podrían extender otros rasgos. Aquí se da una explicación detallada: los rasgos como modificaciones apilables y un ejemplo más completo de la linealización aquí: ¿Por qué no herencia múltiple?
Creo que en otros lenguajes de programación este comportamiento se denomina a veces "Orden de resolución de método" o "MRO".
fuente