2010-09-18 21 views
5

Tôi đang viết một công cụ trò chơi cơ bản và có lớp trừu tượng đại diện cho bất kỳ đối tượng nào có thể vẽ trong thế giới 3D, tuy nhiên bên trong lớp này là một phương thức trừu tượng Render() mà tôi muốn gọi tự động giai đoạn. Làm thế nào tôi có thể thực hiện điều này để mỗi lớp mở rộng từ lớp trừu tượng của tôi sẽ tự động có Render() được gọi là?Bạn sẽ gọi phương thức từ tất cả các phiên bản của một lớp như thế nào?

Tôi đang sử dụng java, android sdk 2.2 và es opengl.

Trả lời

3

Bạn có thể đăng ký mọi đối tượng có thể được hiển thị cho lớp sẽ gọi hàm render() trên tất cả các đối tượng của bạn.

Ví dụ:

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(); 
     } 
    } 
} 

Và bạn có thể đăng ký đối tượng của bạn vào registry trong constructor của RenderedObject của bạn.

+3

biến tĩnh là * ý tưởng rất xấu * để sử dụng trên Android. – aioobe

+0

Nhắc tôi một chút về mẫu người quan sát. – helpermethod

+0

@aioobe, bạn có thể làm điều tương tự mà không có môi trường tĩnh. @Helper Phương pháp, nó hoạt động theo cùng một cách. –

0

Duy trì danh sách tất cả các đối tượng, lặp lại và gọi phương thức.

1

Bạn có thể làm cho một Proxy của Engine của bạn:

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); 
    } 
} 

Tôi không biết khuôn khổ bạn đang sử dụng, vì vậy tôi cho rằng một số phương pháp và giao diện tên. Nhưng ý tưởng là như trên.

+0

Lưu ý rằng các số nhận dạng bắt đầu bằng một chữ số là bất hợp pháp trong Java. – BalusC

+0

hah, tất nhiên rồi. cảm ơn :) – Bozho

Các vấn đề liên quan