2016-05-23 14 views
1

Ich baue ein Programm für ein Einkaufszentrum in C#, wo das Einkaufszentrum mehrere Geschäfte haben wird. Jeder Laden hat ein anderes Kostenberechnungsverfahren, z.B.Vererbung in Einkaufszentrum Design C#

Ein Pizza-Shop berechnet nur die Kosten von der Anzahl der Pizzen und/oder Getränke bestellt:

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); 
     } 
    } 

(Hier PIZZA und DRINK Aufzählungen sind, die verschiedene Arten von Pizzen und Getränke darstellen).

Wo die Käseladen die Kosten aus den Gramm und Art der bestellten Käse berechnet.

Also, ich dachte über Vererbung in diesem Design nach. Ein Pizza-Laden und ein Käse-Laden haben die Ähnlichkeit, dass sie beide Geschäfte im Einkauf sind und beide berechnen die Kosten in irgendeiner Weise (haben die Bestellmethode). Dieser Weg ist jedoch anders. Daher wird die Methode "order()" für jeden Shop verschiedene Parameter verwenden. Das bedeutet, dass ich keine Schnittstelle oder abstrakte Klasse für mein Design verwenden kann, um einen allgemeinen Shop darzustellen. Was wäre eine elegante Art, dies zu gestalten?

Vielen Dank.

+1

Sie könnten der Bestellmethode auch in einer Schnittstelle eines iOrder Objekt nehmen. Wirf es dann in die Implementierung der Bestellmethode. –

+3

Sie können eine 'Order' Klasse verwenden, die' Produkte' und deren Mengen enthält. Dann wird Ihre Funktion 'CalculateCost (Order)' und muss nicht einmal virtuell sein - Sie können es in die Basis 'Shop' Klasse legen. –

+0

Überprüfen Sie dies https://sourcemaking.com/refactoring/smells/long-parameter-list und https://sourcemaking.com/refactoring/introduce-parameter-object – Terrance

Antwort

2

Ein Weg, es zu tun ist, wie folgt aus:

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. 
    } 
}