转换对象和调用方法 - 来自不相关的类

cast Object and call methods - from unrelated classes

我正在使用 Processing.org api - 所以我不能只更改有问题的 类。 问题很简单,但我还没有找到答案:

void drawStuff(PGraphics view) {
    view.beginShape();
    view.vertex(... lots of vertex calls / lines
}

void drawStuff(PShape view) {
    view.beginShape();
    view.vertex(... lots of vertex calls / lines
}

我需要的是一种将它们组合成一个方法的方法,例如:

void drawStuff(Object view) {
    // how to cast to PShape and PGraphics
    view.beginShape();
    view.vertex(... lots of vertex calls /lines
}

类 PShape 和 PGraphics 有 same/similar 方法,至少对于我调用的方法,它们是相同的。但是根据 Processing javadocs,PShape 和 PGraphics 都来自 java.lang.Object,因此据我所知,不共享任何内容。

就像其他人在 OP 的评论中指出的那样,写一个包装器 class/interface。接口是对你的代码的抽象,你不想知道你正在处理的实际实现:

从定义接口开始:

public interface PWrapper {
    public void beginShape();
    public void vertex();
}

然后,由于不幸的设计,其中 PShape 和 PGraphics 除了 Object 之外没有任何共同点,您将需要为每个实现新界面的 classes 实现一个包装器。这些包装器实际上将它们的方法调用委托给包装对象的适当方法。例如,PShape 的包装器将像这样实现:

public final class PShapeWrapper implements PWrapper {

    private final PShape ps;

    public PShapeWrapper (PShape ps){
        this.ps = ps;
    }

    @Override
    public void beginShape(){
        ps.beginShape();
    }

    @Override
    public void vertex(){
        ps.vertex();
    }
}

然后在您的代码中再次定义如下方法:

void drawStuff(PWrapper wrap) {
    wrap.beginShape();
    wrap.vertex();
}

如您所见,此方法不知道它正在处理什么运行时对象:它可能是 PShapeWrapper(见上文)或 PGraphicsWrapper(未发布)。更好的是:它可能是任何实现 PWrapper 但尚不存在的 class,因此这是一个可维护性优势。

这个设计模式叫做"Adapter"。