如何检查我是否使用子类实例?

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

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

我有两个类(伪代码):

CoffeeMachine {
    brewCoffee();
}

PremiumCoffeeMachine extends CoffeeMachine {
    brewCoffee()
    brewEspresso()
}

然后在程序的某个地方,我得到了一系列的咖啡机

Set<CoffeeMachine> coffeeMachines

现在,我想用每台咖啡机煮咖啡。我怎么知道不使用instanceof运算符就可以制作浓缩咖啡?

也许这是唯一的方法,但是我今天多次阅读instanceof运算符会破坏SOLID

您知道一篇有趣的文章,还是可以提供解决此类问题的方法?也许我错了,SOLID说子类不应该包含额外的方法?

iCMS 回答:如何检查我是否使用子类实例?

您提供的参考资料为您提供了许多有关如何解决此问题的见识。

最后,您要遍历Collection个实例中的CoffeeMachine个,并指示它们煮咖啡,如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);
}

现在,可以想象支持PremiumCoffeeMachine(特殊的EspressoCoffee)的CoffeeSelectionCoffeeSelection如果自己可以是interfaceclassenum,则取决于不同咖啡的复杂性和要求。

,

instanceof不会破坏SOLID。您提供的链接上表达的想法是,brewCoffee的合同在子类中不应严格,因为这会破坏合同。实际上,Java不允许您这样做

本文链接:https://www.f2er.com/2048714.html

大家都在问