Я думаю, вы правы, подозревая код, который вы описываете.
Моя первая мысль: если члены DiscountVoucher
недостаточно широки, чтобы существовать как виртуальные или абстрактные в Voucher
тогда функция, принимающая Voucher
в качестве параметра, не должна их трогать.
Итак, чтобы решить проблему, я бы сказал, что вы можете сделать одну из двух вещей:
СначалаВы можете добавить виртуальные методы или свойства к Voucher
, например,
public abstract class Voucher
{
public int Id { get; set; }
public decimal Value { get; protected set; }
public const string SuccessMessage = "Applied";
public decimal Threshold { get { return 0.0; } }
public string FailureMessage { get { return ""; } }
}
Во-вторых, вы можете добавить методы, которые делают то, что вы ожидаете, для каждого Voucher
.Вы сгруппировали их как ваучеры, так что подумайте, что у них общего.Если, скажем, GiftVoucher
и DiscountVoucher
выполняют свои собственные вычисления, чтобы определить, применимы ли они к текущему ShoppingCart
, то для обнаружения этого можно использовать метод Voucher
с именем isValid()
.Например,
public abstract class Voucher
{
public bool isValid(ShoppingCart sc);
public string FailureMessage { get { return "This voucher does not apply"; } }
// ...
}
public class DiscountVoucher : Voucher
{
private decimal Threshold;
public override bool isValid(ShoppingCart sc)
{
return (sc.total >= Threshold);
}
public override string FailureMessage
{
get { return FormatString("Please spend £{0} to use this discount", Threshold); }
}