Java/Processing中避免instanceof,实现多态调用draw()方法的方案
解决方案:统一调用子类draw()方法无需类型判断
完全可行,这正是面向对象多态特性的典型应用场景,具体实现步骤如下:
1. 改造父类FunctionBlock,添加抽象draw()方法
把原本只管理坐标的父类改成抽象类,并定义一个抽象的draw()方法,强制所有子类必须实现自己的绘制逻辑:
abstract class FunctionBlock { // 你已有的X、Y坐标管理代码 protected int x; protected int y; // 定义抽象绘制方法,子类必须实现 public abstract void draw(); }
2. 子类各自实现draw()方法
每个功能块子类(AND、OR、SR等)都重写draw()方法,编写自己的绘制逻辑:
比如AND类的实现:
class AND extends FunctionBlock { @Override public void draw() { // 这里写AND功能块的绘制代码,比如画形状、文字、引脚等 rect(x, y, 80, 60); text("AND", x + 25, y + 35); // 其他绘制逻辑... } }
OR、SR等子类同理,各自实现符合自身特性的绘制逻辑即可。
3. 直接遍历集合调用draw()
现在不需要任何instanceof判断和强制转换,直接遍历ArrayList<FunctionBlock>调用draw()方法就行,JVM会自动根据实际对象类型执行对应子类的方法:
ArrayList<FunctionBlock> blocks = new ArrayList<>(); // 添加各类功能块实例 blocks.add(new AND()); blocks.add(new OR()); blocks.add(new SR()); // 统一调用绘制方法 for (FunctionBlock block : blocks) { block.draw(); }
额外说明
- 新增子类时,只要继承
FunctionBlock并实现draw()方法,直接加入集合就能被自动调用,完全不用修改遍历的代码,符合开闭原则。 - 多态的核心就是:父类引用指向子类对象,运行时自动执行子类的重写方法,省去了手动判断类型的冗余代码。
内容的提问来源于stack exchange,提问作者bask185
相关产品推荐
相关产品推荐

