Considerando il seguente codice di esempio:Pro e contro delle "nuove" proprietà in C#/.Net?
// delivery strategies
public abstract class DeliveryStrategy { ... }
public class ParcelDelivery : DeliveryStrategy { ... }
public class ShippingContainer : DeliveryStrategy { ... }
e la seguente classe di esempio Order:
// 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; }
}
}
Quando ho derivare un nuovo tipo di classe di ordine, esso erediterà la proprietà di consegna di tipo DeliveryStrategy.
Ora, quando si è visto che CustomerOrders devono essere consegnati utilizzando la strategia ParcelDelivery, potremmo considerare 'nuovo' ing la proprietà di consegna nella classe OrdineCliente:
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; }
}
}
(L'OrdineCliente necessita ovviamente di assicurarsi che sia compatibile (polimorfo) con Ordine)
Ciò consente l'utilizzo diretto della strategia ParcelDelivery su CustomerOrder senza la necessità di eseguire il cast.
Prenderesti in considerazione l'utilizzo di questo modello? perché perché no?
Aggiornamento: ho trovato questo modello, invece di usare i generici, perché voglio usarlo per più proprietà. Non voglio utilizzare argomenti di tipo generico per tutte queste proprietà
Finché il metodo di shadowing non ha precondizioni più rigide e non post-condizioni più deboli, ritengo che questa pratica sia perfettamente accettabile. –
Nel primo caso, perché dovresti comunque eseguire il DeliveryStrategy? Il punto di utilizzo del modello di strategia è che i comportamenti implementano un'interfaccia e quindi hanno tutti gli stessi metodi, quindi non è necessario eseguire il cast. –