如何从一个类的所有实例中调用一个方法?

6
我正在编写一个基本的游戏引擎,并有一个抽象类代表在3D世界中可以绘制的任何对象,但是这个类内部有一个抽象方法Render(),我希望在每个绘制阶段引擎自动调用它。我该如何实现这一点,以便从我的抽象类派生的每个类都将自动调用Render()?
我使用java,android sdk 2.2和opengl es。
3个回答

5
您可以将所有可呈现的对象注册到一个类中,该类将在所有对象上调用render()方法。
例如:
public class Registry{
    private static Collection<RenderedObject> register = new ArrayList<RenderedObject>();

    public static void add(RenderedObject obj){
        register.add(obj);
    }

    public static void renderAll(){
        for(RenderedObject obj : register){
            obj.render();
        }
    }
}

您可以在RenderedObject的构造函数中将对象注册到注册表中。


3
在Android上使用静态变量是一个非常糟糕的想法。 - aioobe
@aioobe,您可以在没有静态环境的情况下完成相同的操作。@Helper Method,它的工作方式相同。 - Colin Hebert
1
@助手:像这样显而易见和简单的东西现在被称为“模式”了吗?接下来是什么?变量模式?加法模式? - Matti Virkkunen
@Colin,当然可以。我甚至会说,“你应该不使用静态环境来完成它。” - aioobe
@aioobe和静态变量在Android上为什么不好? - o0'.
1
@Matti Virkkunen 这基本上是观察者模式:对象在创建时注册并在更新时被调用(稍后)。它只缺少一个适当的接口。 - atamanroman

2
您可以为您的引擎创建一个代理:

代理模式

public class RenderingEngine implements Engine {
    private Engine originalEngine;
    private Collection<AbstractRender3DObject> items;

    public RenderingEngine(Engine originalEngine) {
      // assing
    }
    public void draw() {
         originalEngine.draw();
         invokeRender();
    }

    private void invokeRender() {
       for (AbstractRenderItem item : items) {
           item.render();
       }
    }

    public void register(Object3D item) {
         if (item instanceof AbstractRender3DObject) {
             items.add(item);
         }
         super.register(item);
    }
}

我不清楚你使用的框架,所以我假设了一些方法和接口名称。但是思路如上所述。


请注意,在Java中以数字开头的标识符是非法的。 - BalusC

0
维护一个对象列表,循环遍历并调用方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接