2016-05-23 9 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とDRINKはピザやドリンクの種類を表す列挙型です)。

ここで、チーズショップは注文されたチーズのグラムと種類からコストを計算します。

私はこの設計で継承を考えていました。ピザショップとチーズショップは、どちらもショッピングのお店で、何らかの方法でコストを計算する(注文方法がある)という点で類似しています。しかし、この方法は異なります。したがって、メソッド "order()"は、異なるショップごとに異なるパラメータを取ります。これは、一般的なショップを表すためにデザインにインターフェイスまたは抽象クラスを使用できないことを意味します。これを設計するエレガントな方法は何でしょうか?

ありがとうございます。それをやっての

+1

あなたは、注文方法もIORDERオブジェクトのインタフェースに取るかもしれません。次に、それをorderメソッドの実装の中にキャストします。 –

+3

'Product'sとその数量を含む' Order'クラスを使うことができます。あなたの関数は '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. 
    } 
}