C ++ possui herança múltipla simples, muitos designs de linguagem a proíbem como perigosa. Mas algumas linguagens como Ruby e PHP usam sintaxe estranha para fazer a mesma coisa e chamam de mixins ou características. Ouvi muitas vezes que mixins / características são mais difíceis de abusar do que simples herança múltipla.
O que especificamente os torna menos perigosos? Existe algo que não é possível com mixins / características, mas possível com herança múltipla no estilo C ++? É possível encontrar o problema do diamante com eles?
Parece que usamos várias heranças, mas apenas desculpamos que sejam mixins / características para que possamos usá-las.
Respostas:
Existem vários problemas com herança múltipla quando usados com classes de pleno direito, mas todos eles giram em torno da ambiguidade .
A ambiguidade aparece de algumas maneiras diferentes:
x
e o tipo derivado pedex
, o que ele obtém?x
variáveis tiverem tipos incongruentes, você poderá inferir.f
com assinaturas idênticas e alguém chamaf
, qual é chamado?E isso ignora coisas como despacho dinâmico, inferência de tipo, correspondência de padrões e outras coisas que sei menos sobre as quais se tornam mais desafiadoras quando o idioma suporta herança múltipla de classes completas.
Traços ou mix-ins (ou interfaces ou ...) são todos os constructos que limitam especificamente os recursos de um tipo para que não haja ambiguidade. Eles raramente possuem algo. Isso permite que a composição dos tipos fique mais suave, porque não há duas variáveis ou duas funções ... há uma variável e uma referência; uma função e uma assinatura. O compilador sabe o que fazer.
A outra abordagem comum adotada é forçar o usuário a "construir" (ou misturar) seu tipo, um de cada vez. Em vez de as classes base serem parceiros iguais no novo tipo, você adiciona um tipo a outro - substituindo tudo o que estava lá (geralmente com sintaxe opcional para renomear e / ou reexpor os bits substituídos).
Dependendo do idioma - geralmente se torna problemático ou impossível mesclar implementações de funções e armazenamento para variáveis de várias classes base e expô-las no tipo derivado.
Ocasionalmente, variações menos graves aparecerão com base no seu idioma, mas geralmente não. O ponto principal das características é quebrar esse tipo de ambiguidade.
fonte
with
palavra - chave faz lá.