// delivery strategies
public abstract class DeliveryStrategy { ... }
public class ParcelDelivery : DeliveryStrategy { ... }
public class ShippingContainer : DeliveryStrategy { ... }
と次のサンプル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; }
}
}
新しい型の受注クラスを派生すると、DeliveryStrategy型のDeliveryプロパティが継承されます。
CustomerOrdersがParcelDelivery戦略を使用して配信されなければならない場合、CustomerOrderクラスのDeliveryプロパティを「 new」と見なすことができます。 Orderと互換性がある(polymorph)ことを確認してください)
これにより、キャスティングを必要とせずにCustomerOrderでParcelDelivery戦略を直接使用できます。
このパターンの使用を検討しますか?なぜ/なぜですか?
を更新してください:これは、複数のプロパティに対してこれを使用したいので、ジェネリックを使用する代わりに、このパターンを思いつきました。これらのすべてのプロパティにジェネリック型引数を使用したくない
あなたのシャドウイング方法がより厳しい前提条件とより弱い事後条件を持たない限り、このプラクティスは完全に受け入れられると思います。 –
最初に、どうしてなぜDeliveryStrategyをキャストする必要がありますか?戦略パターンの使用のポイントは、ビヘイビアがインタフェースを実装するため、すべて同じメソッドを持つため、キャストする必要はありません。 –