java - 如何检查我是否使用子类的实例?
问题描述
我读了一篇关于第三个 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 说子类不应该包含额外的方法?
解决方案
您给出的参考资料提供了很多关于如何处理这个问题的见解。
最后,您想要迭代 a Collection
ofCoffeeMachine
实例并指示它们煮咖啡,如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
)。CoffeeSelection
ifself 可以是 a interface
、 aclass
或 an enum
,具体取决于不同咖啡的复杂性和要求。
推荐阅读
- xquery - XQUERY:如何使用目录中的所有元素进行转换
- c# - C# .Net Core 3.1 System.Text.Json 在序列化中忽略空集合
- java - tomEE 是否知道 Maven 依赖关系?
- c - 如果程序在启动时运行,飞行写入不起作用
- r - 如何分隔我的不同数据条目以匹配我的图例条目?
- javascript - 从输入类型提交按钮从一个选项卡传递到另一个选项卡
- sql - 获取具有多列最小值的行
- reactjs - 赛普拉斯测试在测试中间返回 LocalHost:3000
- typescript - 在反应三纤维中移动正交相机
- php - Facebook Webdriver 不会在 Foreach 中打开 url