我正在使用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,所以据我所知,不要分享任何内容。
答案 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但仍然不存在的类,所以这是一个可维护性加。
此设计模式称为“适配器”。