You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 22:40:41