Uno puede encontrarse con un escenario en el que eliminar una dependencia "amiga" entre dos clases es deseado, particularmente debido a preocupaciones sobre interdependencia excesiva, problemas de mantenimiento y estándares UML obsoletos.
Extraiga los métodos expuestos por la clase "amigo" y cree una nueva interfaz abstracta. Establezca una relación de dependencia de la clase "amiga" a la interfaz y una dependencia de "llamada" de la otra clase a la interfaz.
Mover las operaciones que conforman la dependencia de "llamada" de la clase dependiente a la interfaz abstracta. Haga que la interfaz extienda un constructor protegido con fines de herencia y oculte la asociación de generalización protegida entre la clase dependiente y la interfaz.
En el paso final, cree un método en la clase "amiga" para pasar una referencia de la interfaz abstracta a la clase dependiente. Llame a este método desde la clase dependiente durante la inicialización para establecer la conexión necesaria.
ClaseA (proveedor):
class ClassA : protected InternalInterface {
public:
attachAccessor(ClassAAccessor &accessor) {
accessor.setInternalInterfaceRef(*this);
}
};
ClaseAAccessor (amigo):
class ClassAAccessor {
public:
ClassAAccessor(ClassA& classA) : internalInterfaceRef(0) {
classA.attachAccessor(*this);
}
private:
InternalInterface* internalInterfaceRef;
};
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3