Teniendo en cuenta el siguiente código de ejemplo:Pros y contras de 'nuevas' propiedades en C#/.Net?
// delivery strategies
public abstract class DeliveryStrategy { ... }
public class ParcelDelivery : DeliveryStrategy { ... }
public class ShippingContainer : DeliveryStrategy { ... }
y la siguiente clase de muestra Orden:
// order (base) class
public abstract class Order
{
private DeliveryStrategy delivery;
protected Order(DeliveryStrategy delivery)
{
this.delivery = delivery;
}
public DeliveryStrategy Delivery
{
get { return delivery; }
protected set { delivery = value; }
}
}
Cuando derivo un nuevo tipo de clase de orden, que heredarán la propiedad Entrega de tipo DeliveryStrategy.
Ahora, cuando se da que CustomerOrders deben ser entregados utilizando la estrategia ParcelDelivery, podríamos considerar 'nueva' ing la propiedad de entrega en la clase CustomerOrder:
public class CustomerOrder : Order
{
public CustomerOrder()
: base(new ParcelDelivery())
{ }
// 'new' Delivery property
public new ParcelDelivery Delivery
{
get { return base.Delivery as ParcelDelivery; }
set { base.Delivery = value; }
}
}
(El CustomerOrder necesita, obviamente, a asegúrese de que sea compatible (polimorfo) con el pedido)
Esto permite el uso directo de la estrategia de distribución de paquetes en CustomerOrder sin la necesidad de fundición.
¿Consideraría utilizar este patrón? ¿por qué por qué no?
Actualización: se me ocurrió este patrón, en lugar de usar genéricos, porque quiero usar esto para múltiples propiedades. No deseo utilizar argumentos de tipo genérico para todas estas propiedades
Siempre que su método de sombreado no tenga condiciones previas más estrictas ni condiciones posteriores más débiles, creo que esta práctica es perfectamente aceptable. –
En la primera instancia, ¿por qué necesitarías lanzar la estrategia de entrega de todos modos? El punto de utilizar el patrón de estrategia es que los comportamientos implementan una interfaz y, por lo tanto, tienen todos los mismos métodos, por lo que no es necesario transmitirlos. –