转换对象和调用方法 - 来自不相关的类
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"。
我正在使用 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"。