Учитывая следующий пример кода:Плюсы и минусы «новых» свойств в C#/.Net?
// delivery strategies
public abstract class DeliveryStrategy { ... }
public class ParcelDelivery : DeliveryStrategy { ... }
public class ShippingContainer : DeliveryStrategy { ... }
и следующий класс заказа образца:
// 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.
Теперь, когда дано, что CustomerOrders должна быть доставлена с использованием стратегии ParcelDelivery, мы могли бы рассмотреть «нового» ИНГ свойства доставки в классе 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; }
}
}
(CustomerOrder, очевидно, должен обеспечить совместимость (полиморф) с заказом)
Это позволяет прямое использование стратегии ParcelDelivery на CustomerOrder без необходимости кастинга.
Не могли бы вы использовать этот шаблон? почему, почему нет?
Обновление: Я нашел этот шаблон вместо использования дженериков, потому что я хочу использовать его для нескольких свойств. Я не хочу использовать аргументы общего типа для всех этих свойств.
Пока ваш метод затенения не имеет более строгих предварительных условий и не имеет более слабых постусловий, я считаю, что эта практика вполне приемлема. –
В первую очередь, почему вам нужно было лить DeliveryStrategy в любом случае? Точка использования шаблона стратегии заключается в том, что поведение реализует интерфейс и поэтому имеет все те же методы, поэтому его не нужно отличать. –