我有一张课程券:

public abstract class Voucher
    {
        public int Id { get; set; }
        public decimal Value { get; protected set; }
        public const string SuccessMessage = "Applied";
    }


和一个子类的GiftVoucher

public class GiftVoucher : Voucher
    {
    }


和另一个子类DiscountVoucher

public class DiscountVoucher : Voucher
    {
        public decimal Threshold { get; private set; }
        public string FailureMessage { get { return "Please spend £{0} to use this discount"; } }
    }


您可以看到DiscountVoucher具有两个特定的属性Threshold和FailureMessage,分别表示您需要花费多少钱才能获得折扣,以及显示失败消息(如果用户没有花费,则显示失败消息)。

我的问题是这个。我有一个Voucher对象的集合,我不想在代码中做的就是这样

if (voucher is DiscountVoucher)
{
   // cast voucher to a DiscountVoucher and then call the specific methods on it
}


因为这根本无法维持。同时,我不想将那些特定的方法放在Voucher抽象类中,因为它们不适用于所有类型的Vouchers。有谁知道如何设计此功能?

最佳答案

好吧,您在这里获得的是该策略模式的一个版本。我认为最终不必决定是否拥有一种凭证类型还是可以使用的,但您可以限制变化的数量(如果可以的话,可以选择凭证类别)。

例如,您可能最终得到五个凭证,这些凭证实现了称为“ StandardVoucher”的接口和三个称为“ DiscountVoucher”的接口,但是现在不必处理八个案例,而只需两个。

这些界面可以覆盖显示可用方法的一系列凭证,而无需担心每个凭证实现的细节。

10-07 23:08