OOPS - 面向对象编程

时间:2016-06-27 09:41:29

标签: c# oop

我正在设计 OOP 系统。

在这个系统中:

  • 我有一辆自行车
  • 我有自行车项目
  • 数量作为行的属性
  • 我根据自行车价格处理订单的订单对象

示例:假设自行车价格 100 ,那么我们有 4 价格 100 的自行车,然后是我将对每辆单独的自行车申请一些折扣并计算总数。同样地,我可以有不同的价格,并应用不同的计算逻辑(折扣等)。

所以基本上我想通过多态来做到这一点并牢记 SOLID 原则。如果没有梯子,我也不想拥有if else,因为我希望能够在不改变每个类的实现的情况下添加新的价格/折扣。

任何帮助表示赞赏

编辑:改进格式

2 个答案:

答案 0 :(得分:1)

您可以做的如下:

您可以创建一个界面来描述折扣逻辑。 (如果你愿意的话,Discount课程也可以int,但也许你还有其他一些想要与折扣金额一起返回的东西。

public interface IOrderDiscount
{
    Discount GetDiscount(Order order);
}

然后,您可以实施您支持的不同类型的折扣。例如:

public class FourBikesDiscount : IOrderDiscount
{
    public Discount GetDiscount(Order order)
    {
        //TODO - check the order according to this specific type of discount
    }
}

public class AnyOtherDiscountLogic : IOrderDiscount
{
    public Discount GetDiscount(Order order)
    {
        throw new NotImplementedException();
    }
}

现在,将对给定订单应用折扣的类应该通过以下方式之一将其作为依赖项接收:

  1. 如果您希望只有一种可以随时应用的折扣,那么只需在类c&c; c构造函数中添加参数:IOrderDiscount orderDiscount。
  2. 如果您想支持一系列折扣,并且每次在订单上应用所有折扣,请添加参数:IEnumerable orderDiscounts。
  3. 如果您想根据某些逻辑向每个订单申请特定折扣,请使用类似于此界面的工厂:(并将其传递给ctor的参数。

    公共接口IDiscountFactory {     public IOrderDiscount GetDiscountOptions(Order order); }

答案 1 :(得分:0)

基本上我想要实现的目标如下。我有以下示例代码库:

switch (line.Bike.Price)
{
   case Bike.OneThousand:
      if (line.Quantity >= 20)
         thisAmount += line.Quantity * line.Bike.Price * .9d;
      else
         thisAmount += line.Quantity * line.Bike.Price;
      break;
   case Bike.TwoThousand:
      if (line.Quantity >= 10)
         thisAmount += line.Quantity * line.Bike.Price * .8d;
      else
         thisAmount += line.Quantity * line.Bike.Price;
      break;
}

这里基于自行车常数属性,逻辑正在激活。假设明天新的常量被引入,我将再次编写另一个case语句和一些逻辑。我希望这个过程是多态的。我应该能够像这样编写它:

Idiscount discount=new Discount();
Icalc calculate=new Calculate(line, Bike.OneThousand,discount)

在运行时我提供折扣计算界面,价格和计算将为我做。这样的事情。但我很困惑如何将价格与折扣挂钩,因为逻辑是根据自行车价格开出的。