考虑以下示例代码:
// 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属性:
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显然需要确保与Order相容(多态))
这样可以直接在CustomerOrder上使用ParcelDelivery策略,而无需投射.
你会考虑使用这种模式吗?为什么不为甚么
解决方法
我认为这是一个很好的模式.它使得通过消除转换结果的需要来明确地使用派生类型变得更容易,并且它不会“破坏”基类行为.实际上,在BCL中的某些类中使用了类似的模式,例如查看DbConnection类层次结构:
> DbConnection.CreateCommand()返回一个DbCommand
> sqlConnection.CreateCommand()使用’new’隐藏基本实现来返回一个sqlCommand.
>(其他DbConnection实现也是一样)
因此,如果通过DbConnection变量来操作连接对象,CreateCommand将返回一个DbCommand;如果您通过sqlConnection变量操作它,CreateCommand将返回一个sqlCommand,如果将其分配给sqlCommand变量,则避免使用该转换.
原文地址:https://www.jb51.cc/csharp/93166.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。