C ++: evitando a manutenção dupla em hierarquias de herança
-
23-09-2019 - |
Pergunta
Ao criar uma estrutura de herança C ++, você deve definir as funções de membro exatamente da mesma forma em vários lugares:
Se B é uma classe base abstrata e D, E e F todos herdam de B, você pode ter isso:
class B
{
virtual func A( ... params ) = 0;
};
class D : public B
{
func A( ... params );
};
/* ... etc... similar implementations for E and F */
Então, obviamente há alguma duplicação aqui. Se a interface para B for grande, você poderá ter muitos lugares para mudar se a interface precisar alterar.
Um colega de trabalho sugeriu alguns truques com um #includes criados criados, ala:
class D: public B
{
#include "B_Interface.h" // B_Interface.h is a specially crafted .h file
}
Isso parece um pouco cravo? É isso? Existe uma solução melhor para evitar manutenção dupla?
Além disso, talvez a solução aqui seja realmente ferramentas realmente melhores para suportar o idioma, como o Visual Assist X?
Editar: Suponha que as classes derivadas devem ter implementações exclusivas.
Solução
Na verdade, o maior problema de mudar uma interface geralmente é todo o código que usos Não é o código que o implementa. Se for fácil alterá -lo para o implementador, provavelmente tornaria a vida mais difícil para os usuários.
Outras dicas
Que é doloroso mudar uma interface amplamente usada não é um bug; É um recurso.
Além disso, talvez a solução aqui seja realmente ferramentas realmente melhores para suportar o idioma, como o Visual Assist X?
Exatamente. Alterar assinaturas de método é um característica chave de ferramentas de refatoração.
Se você precisar implementá -los repetidamente com algum comportamento padrão, talvez eles devam ser apenas virtuais e não puro virtuais.
Em vez de usar o pré -processador para mais uma maneira de ser usada, tentaria meu editor (ou IDE, se é isso que você gosta.)