gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 12:03:01 24 4
gpt4 key购买 nike

我正在使用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 类具有相同/相似的方法,至少对于我调用的方法来说,它们是相同的。但根据处理javadocs,PShape和PGraphics都来自java.lang.Object,所以据我了解不共享任何东西。

最佳答案

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

从定义接口(interface)开始:

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

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

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

关于java - 转换对象并调用方法 - 来自不相关的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27860946/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com