在抽象方法中传递参数

Passing Parameters In Abstract Method

我在 Java 中有一个摘要 class,它调用了这个方法

public abstract void onImageRendered(BufferedImage render)

我希望用户使用此方法访问渲染图像。我有另一种方法叫做

public void render()

渲染图像。抽象方法中的缓冲图像不应是任何图像,而是该方法渲染的图像。
如何从该方法传递渲染图像作为抽象方法的参数?
这是我的代码:

public static void render(Scene scene) throws MORISIllegalMethodCallException{
    if(propertiesAreSet){
        Camera activeCamera = scene.getActiveCamera();

        for (int x = 0; x < activeCamera.getWidth(); x++) {
            for (int y = 0; y < activeCamera.getHeight(); y++) {
                Ray ray = Ray.shootAt(activeCamera.getOrigin(), new Vector(x - activeCamera.getWidth()/2.0, activeCamera.getHeight()/2.0 - y, -(activeCamera.getHeight()/2.0)/Math.tan(activeCamera.getFov() * 0.5)).mul(activeCamera.getDirection()).normalize());
                for (Renderable object : scene.getSceneObjects()) {
                    if (object.intersects(ray)){
                        //Assign colors to buffered image object "this.image" and do other necessary things
                    }
                }
            }
        }
    }else {
        throw new MORISIllegalMethodCallException("The method moris.renderer.MORISRT.setProperties(int, double) should be executed before invoking the method moris.renderer.MORISRT.render(moris.scene.Scene)");
    }
}

abstract void onImageRendered(BufferedImage renderedImage);//Here, the BufferedImage object should be "this.image"

渲染图是这样的:
我尝试在 Whosebug 上搜索类似问题,还检查了一些其他来源,但它们似乎没有帮助。
如有任何建议,我们将不胜感激。
提前致谢。

abstract void onImageRendered(BufferedImage renderedImage);//Here, the BufferedImage object should be "this.image"

首先要说的是,您正在尝试向抽象方法添加实现细节。这在定义上是错误的。如果是抽象方法实现委托给subclasses。但这仅意味着您可以在每个子 class 中自由使用 this.image。你可以做的是,在你的摘要中 class,有一个...

protected BufferedImage image;

...您可以从每个子类中引用为 this.image

但是您必须更改方法的签名 render()。如果要引用this,则不能是staticstatic 方法只能访问 static 属性,this 总是引用实例属性。

更新

可以调用抽象中的抽象方法class:

public abstract class MyAbstractClass {
    private BufferedImage image;

    public void render() {
        // ...
        onImageRendered(this.image);
        // ...
    }

    public abstract void onImageRendered(BufferedImage renderedImage);
}
public class MyConcreteClass extends MyAbstractClass {
    @Override
    public abstract void onImageRendered(BufferedImage renderedImage) {
        // do stuff with renderedImage, which will always be the image
        // in the rendered metho called on the parent class
    }
}