(Nota: usei 'erro' em vez de 'problema' no título por razões óbvias ..;)).
Fiz algumas leituras básicas sobre Traits in Scala. Eles são semelhantes às interfaces em Java ou C #, mas permitem a implementação padrão de um método.
Fiquei pensando: isso não pode causar um caso do "problema do diamante", e é por isso que muitos idiomas evitam a herança múltipla em primeiro lugar?
Se sim, como Scala lida com isso?
scala
multiple-inheritance
Aviv Cohn
fonte
fonte
Respostas:
O problema do diamante é a incapacidade de decidir qual implementação do método escolher. O Scala resolve isso definindo qual implementação escolher como parte das especificações de idioma ( leia a parte sobre Scala neste artigo da Wikipedia) ).
É claro que a mesma definição de ordem também pode ser usada na herança múltipla de classe, então por que se preocupar com características?
A razão pela qual o IMO são construtores. Os construtores têm várias limitações que os métodos regulares não têm - eles podem ser chamados apenas uma vez por objeto, precisam ser chamados para cada novo objeto, e o construtor de uma classe filho deve chamar seu construtor pai como primeira instrução (a maioria das linguagens faça isso implicitamente para você, se você não precisar passar parâmetros).
Se B e C herdam A e D herdam B e C, e ambos os construtores de B e C chamam o construtor de A, o construtor de D chama o construtor de A duas vezes. Definir quais implementações escolher como Scala fez com os métodos não funcionará aqui, porque ambos construtores de B e C devem ser chamados.
As características evitam esse problema, pois não possuem construtores.
fonte
Scala evita o problema do diamante por algo chamado "linearização de características". Basicamente, ele procura a implementação do método nas características que você estende da direita para a esquerda. Exemplo simples:
Dito isto, a lista de características pesquisadas pode conter mais do que as que você deu explicitamente, pois podem estender outras características. Uma explicação detalhada é dada aqui: Traços como modificações empilháveis e um exemplo mais completo da linearização aqui: Por que não herança múltipla?
Eu acredito que em outras linguagens de programação esse comportamento às vezes é chamado de "ordem de resolução de método" ou "MRO".
fonte