Pode-se encontrar um cenário em que a remoção de uma dependência de "amigo" entre duas classes é desejado, principalmente devido a preocupações com interdependência excessiva, problemas de manutenção e padrões UML desatualizados.
Extraia os métodos expostos pela classe "amigo" e criam uma nova interface abstrata. Estabeleça um relacionamento de dependência da classe "amigo" para a interface e uma dependência de "chamada" da outra classe para a interface.
Mova as operações que constituem a dependência de "chamada" da classe dependente para a interface abstrata. Faça com que a interface estenda um construtor protegido para fins de herança e oculte a associação de generalização protegida entre a classe dependente e a interface.
Na etapa final, crie um método na classe "amigo" para passar uma referência da interface abstrata para a classe dependente. Chame esse método da classe dependente durante a inicialização para estabelecer a conexão necessária.
ClassA (provedor):
class ClassA : protected InternalInterface {
public:
attachAccessor(ClassAAccessor &accessor) {
accessor.setInternalInterfaceRef(*this);
}
};
ClassAAccessor (amigo):
class ClassAAccessor {
public:
ClassAAccessor(ClassA& classA) : internalInterfaceRef(0) {
classA.attachAccessor(*this);
}
private:
InternalInterface* internalInterfaceRef;
};
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3