接口是否应定义特定于实现的枚举值?

7
考虑以下类的组织方式:
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
    }
}

由于这两家餐厅提供完全不同的菜肴,那么在界面设计方面,如何正确地表示“菜品”的“类型”呢?

将所有菜肴 -- 意大利菜和中式菜 -- 定义为接口的一部分,并使用该枚举作为“菜品”的“类型”,是否是一个好的设计决策呢?


1
为什么不使用接口或抽象类Dish - CollinD
3
这根本不应该是枚举。如果一家泰国餐馆目前提供绿咖喱和红咖喱,现在想增加黄咖喱作为新菜品,你真的希望餐馆联系开发者添加黄咖喱到枚举中吗?不需要!餐馆应该能够定义新的菜品而不需要进行代码更改。 - Andreas
2个回答

4

您在 Dish 上使用了 Object 类型。这意味着任何东西都可以被视为 Dish。

这是否意味着您可以将 Phone 或 Pen 当作 Dish 服务?不行;Dish 就是 Dish。为什么不也为 Dish 创建一个抽象呢?

更好的设计应该是:

interface Restaurant 
{
    void dine(Dish dish);
}

Dish 可以是一个接口或抽象类;选择更合适的一个。然后每种上菜的菜肴将作为一个单独的类来继承/实现 Dish


2

我认为最正确的方法是定义一个通用接口,例如

interface Restaurant<T> {

    public void dine(T dish);

}

编辑:嗯,我在考虑使用C#……不知道是否适合。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接