在抽象方法中传递参数
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
,则不能是static
。 static
方法只能访问 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
}
}
我在 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
,则不能是static
。 static
方法只能访问 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
}
}