2016-01-07 6 views
7

Si consideri il seguente organizzazione delle classi:L'interfaccia deve definire valori di enum specifici dell'implementazione?

interface Restaurant 
{ 
    public void dine(Object dish); 
} 

class ItalianRestaurant implements Restaurant 
{ 
    public void dine(Object dish) 
    { 
     // eat with spoon and forks 
    } 
} 

class ChineseRestaurant implements Restaurant 
{ 
    public void dine(Object dish) 
    { 
     // eat with chopsticks 
    } 
} 

Dal momento che entrambi i ristoranti servono completamente diversi set di piatti, quello che sarà il modo corretto (design-saggio) per rappresentare il type del dish nell'interfaccia?

Sarà una buona decisione di progettazione definire un Enum elencando tutti i piatti - italiano e cinese - come parte dell'interfaccia e utilizzare tale Enum come type per dish?

+1

Perché non un'interfaccia o una classe astratta 'Piatto'? – CollinD

+3

Non dovrebbe essere affatto un enum. Se un ristorante thailandese attualmente serve Green Curry e Red Curry e poi vuoi aggiungere Yellow Curry come nuovo piatto, vuoi veramente che il ristorante contatti lo sviluppatore per chiedere di aggiungere Yellow Curry all'enum? No! I ristoranti dovrebbero essere in grado di definire nuovi piatti senza richiedere un cambio di codice. – Andreas

risposta

4

È Ho usato il tipo Object per un piatto. Significa che qualsiasi cosa può essere considerata un piatto qui.

Ciò significa che è possibile servire un Phone o Pen come un piatto? No; Un piatto è un piatto. Perché non creare un'astrazione anche per Dish?

Meglio disegno sarebbe:

interface Restaurant 
{ 
    void dine(Dish dish); 
} 

Dish potrebbe essere un'interfaccia o una classe astratta; Scegline uno più appropriato Quindi ogni tipo di piatto servito andrà come una classe separata che eredita/implementa Dish.

2

penso che il modo più corretto sarebbe definendo un'interfaccia generica come

interface Restaurant<T> { 

    public void dine(T dish); 

} 

EDIT: bene, sto pensando in C# .... non so se si adatta