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

时间:2015-01-09 12:48:38

标签: java casting

我正在使用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这两个类有相同/类似的方法,至少我调用它们,它们是相同的。但根据Processing javadocs,PShape和PGraphics都来自java.lang.Object,所以据我所知,不要分享任何内容。

1 个答案:

答案 0 :(得分:1)

与OP的评论中指出的其他人一样,编写一个包装类/接口。接口是代码的抽象,您不希望知道您正在处理的实际实现:

从定义界面开始:

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

然后,由于PShape和PGraphics之间没有任何共同点但是对象的不幸设计,您需要为实现新接口的每个类实现一个包装器。这些包装器实际上将它们的方法调用委托给包装对象的适当方法。例如,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但仍然不存在的类,所以这是一个可维护性加。

此设计模式称为“适配器”。