2016-05-23 54 views
1

我正在C#购物中心建设一个购物商场的程序,购物中心里有几家商店。每个商店有不同的成本计算方法,例如,继承购物中心设计C#

一个比萨店只是计算成本从有序比萨饼和/或饮料的数量:

public class PizzaShop 
    { 
     public double order(int numberOfPizzas, PIZZA pizza, int numberOfDrinks, DRINK drink) 
     { 
      double costOfPizzas; 
      if (pizza == PIZZA.margarita) 
      { 
       costOfPizzas = 5; 
      } 
      else 
      { 
       costOfPizzas = 6; 
      } 

      // find drinks cost similarly and return the total: 
      return (costOfPizzas * numberOfPizzas) + (costOfDrinks * numberOfDrinks); 
     } 
    } 

(这里PIZZA,喝是代表不同类型的比萨饼和饮料的枚举)。

如果奶酪店根据克数和奶酪类型计算成本。

所以,我在考虑在这个设计中继承。比萨店和奶酪店的相似之处在于他们都是购物商店,他们都以某种方式计算成本(有订单方法)。然而这种方式是不同的。因此,“order()”方法将为每个不同的商店采用不同的参数。这意味着我不能使用接口或抽象类来代表我的设计来表示一般商店。什么是设计这个优雅的方式?

谢谢。这样做的

+1

你可以有顺序的方法也需要在IOrder对象的接口。然后将其转换为订单方法的实施。 –

+3

您可以使用包含“产品”及其数量的“订单”类。然后你的函数变成'CalculateCost(Order)',它甚至不必是虚拟的 - 你可以把它放在基类'Shop'类中。 –

+0

查看https://sourcemaking.com/refactoring/smells/long-parameter-list和https://sourcemaking.com/refactoring/introduce-parameter-object – Terrance

回答

2

一种方法是这样的:

class Shop 
{ 
    public double GetPrice(List<IProduct> products) 
    { 
    return products.Sum(x => x.GetPrice()); 
    } 
} 

interface IProduct { double GetPrice(); }; 
class Pizza : IProduct 
{ 
    double GetPrice() 
    { 
    return 5.0;//Get the price here. 
    } 
}