C#/ .Net中“新”属性的优缺点?

考虑以下示例代码
// 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变量,则避免使用该转换.

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...