首页 > 解决方案 > 如何检查我是否使用子类的实例?

问题描述

我读了一篇关于第三个 SOLID 原则的有趣文章:https ://stackify.com/solid-design-liskov-substitution-principle/

同时,我读到使用instanceof运算符可能违反 SOLID 规则。如何处理以下问题。

我有两个类(伪代码):

CoffeeMachine {
    brewCoffee();
}

PremiumCoffeeMachine extends CoffeeMachine {
    brewCoffee()
    brewEspresso()
}

然后在程序的某个地方我收集了一些咖啡机

Set<CoffeeMachine> coffeeMachines

现在我想用每台咖啡机煮咖啡。我怎么知道我可以在不使用instanceof操作员的情况下制作浓缩咖啡?

也许这是唯一的方法,但是我今天读了很多次,instanceof操作员破坏了 SOLID

你知道一篇有趣的文章,或者你能提供解决这个问题的方法吗?也许 II 错了,SOLID 说子类不应该包含额外的方法?

标签: javaoopsolid-principlesinstanceof

解决方案


您给出的参考资料提供了很多关于如何处理这个问题的见解。

最后,您想要迭代 a CollectionofCoffeeMachine实例并指示它们煮咖啡,如brewCoffee(). 你是对的,要知道你的机器是否是高级机器,你必须使用instanceof操作员。

如果您想要更灵活的解决方案,可以使用以下设计:

public interface CoffeeMachine {

    // check if this machine supports a given selection
    // if not, #brewCoffee should throw an exception
    boolean supports(CoffeeSelection selection);
   
    CoffeeDrink brewCoffee(CoffeeSelection selection);
}

现在,可以想象 aPremiumCoffeeMachine支持EspressoCoffee(a special CoffeeSelection)。CoffeeSelectionifself 可以是 a interface、 aclass或 an enum,具体取决于不同咖啡的复杂性和要求。


推荐阅读