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.

Foi útil?

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.)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top