2016-05-23 19 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. 
    } 
}