una resueltos que programar programacion poo orientada objetos ejercicios ejemplos como clases clase c++ oop class delegation forwarding

c++ - resueltos - En OOP, ¿qué es el reenvío y en qué se diferencia de la delegación?



que es la poo en c++ (3)

¿Podría alguien explicar la diferencia entre reenvío y delegación? Parecen similares, pero no he podido encontrar una buena definición de reenvío, así que no estoy seguro de entender.


El reenvío es algo así como "herencia a través de la contención", o "herencia de implementación por el camino difícil".

Herencia de implementación típica:

class Base { public: void baseFn() { } }; class Derived : public Base { public: void derivedFn() { } };

Ahora, una instancia de Derivados tiene un método baseFn (). Esta es una forma de compartir implementación entre diferentes clases.

El reenvío se ve así:

class Contained { public: void containedFn() { } }; class Thing { public: void thingFn() { } void containedFn() { mContained.containedFn(); } private: Contained mContained; };

También podrías haber implementado eso con herencia privada.

La delegación es un caso especial de reenvío, donde en la "cosa para reenviar" es una interfaz en sí misma.

class Delegate { public: virtual void doDelegateAction() = 0; }; class DelegateA : public Delegate { virtual void doDelegateAction() { } }; class DelegateB : public Delegate { virtual void doDelegateAction() { } }; class Thing { public: void Thing (Delegate * delegate) { mDelegate = delegate; } void thingFn() { } void containedFn() { if (mDelegate) mDelegate->doDelegateAction(); } private: Delegate * mDelegate; // Note, we don''t own this memory, buyer beware. };

Ahora, puede intercambiar la implementación de delegado en tiempo de ejecución, mientras que al reenviar no puede (y es posible que no desee hacerlo, por lo que lo haría).

Si eso responde a la pregunta incorrecta, avíseme en un comentario y eliminaré la respuesta.


Primero definamos dos términos:

  • remitente : the object that sends a message/task to another object(the receiver)
  • receptor : the object that receives a message/task from the sender

La diferencia entre el reenvío y la delegación es que al reenviar the receiver acts in its own context mientras que en la delegación the receiver acts on the behalf of the sender .

Aquí hay una gran metáfora de este blog :

La delegación y el reenvío son muy similares. Una metáfora que podría ayudar a distinguirlos es pensar en recibir un correo electrónico pidiéndole que done algo de dinero a una organización benéfica digna.

  • Si reenvía el correo electrónico a un amigo, y el amigo dona dinero, el amigo está donando su propio dinero y obteniendo su propio recibo de impuestos.
  • Si delega responder a su contador, el contador dona su dinero a la organización benéfica y usted recibe el recibo de impuestos.

Son ideas similares en que un objeto depende de otro para obtener ayuda. Así es como pienso en las dos ideas dado mi fuerte sesgo de Objective-C:

delegación: Se debe tomar una decisión, pero no quiero tomarla. Dejaré que mi delegado se encargue de eso.

En Cocoa, por ejemplo, NSTableView utiliza un delegado para personalizar el comportamiento de la tabla. La delegación proporciona una forma de personalizar un objeto permitiendo que otro objeto, el delegado, proporcione la personalización. Continuando con el ejemplo, el delegado de una vista de tabla implementa una interfaz NSTableViewDelegate que la tabla usa para hablar con su delegado.

reenvío: alguien acaba de enviarme un mensaje que no entiendo, pero conozco otro objeto que podría implementarlo. Pasaré la invocación de ese mensaje a ese objeto.

En Cocoa, una vez más, cualquier clase puede implementar el método -forwardInvocation: Si se envía un mensaje a un objeto que no lo implementa, se llama al método -forwardInvocation de ese objeto, y el objeto puede decidir pasar la invocación a otro objeto. Ese objeto podría ser su delegado, o podría ser algún controlador de errores de todo el sistema, o lo que sea. NSProxy usa esto para que parezca que implementa todos los métodos; simplemente pasa la invocación a su objeto maestro.

Tenga en cuenta que con el reenvío, no hay una interfaz de delegado definida; el mensaje acaba de pasar a otro objeto. Otro lugar donde vería lo que llamaría reenvío es cuando un objeto contiene otro objeto que utiliza para implementar alguna interfaz. Cualquier mensaje a esa interfaz simplemente se reenvía al objeto contenido, que hace todo el trabajo.