简体   繁体   中英

Java: Best way to get object from extended sub-class

So, I probably have tought of my program the wrong way, but I can't find how to do what I'm trying to in a pretty way. I also could not find how to search this in Google properly, so sorry if this is already answered. Here is what I have:

I have an abstract class GameWorld which will be extended into several different gameWorlds, like GameAWorld , GameBWorld ... I have another abstract class GameRenderer which will be responsible for the rendering of these worlds, and will also be extended into GameARenderer , GameBRenderer ...

My issue is, when GameARenderer is created (in another class, not GameAWorld), it receives a general GameWorld (which is actually a GameAWorld). I need to get an object from Game A World, which is not in GameWorld. Therefore, what I am doing in the GameARenderer now is:

Obj chair = ((GameAWorld)world).getChair();

because if I simply do world.getA(), without the cast, GameWorld won't have the getA() method.

I believe that this may be sounding confusing, so I will try to clarify it later on, if no one understands...

Feel free to suggest changes on my architecture, if no code will solve it.

As a short but hopefully good enough example I'll try to help you out.

public interface Drawable {
    void draw(Graphics g);
}

public class GameWorld {
    List<GameObject> gameObjects;
    List<GameObject> getGameObjects() {...}
}

public class GameAWorld extends GameWorld {...}

public class GameObject implements Drawable {
    // this could be abstract too. Whatever suits your needs.
    @Override
    public void draw(Graphics g) { ... }
}

//inside a renderer
List<GameObject> gameObjects = gameWorld.getGameObjects();
for (GameObject go : gameObjects)
    go.draw(g);

That's the way I'd do it. Be advised I slapped that together quick-like; it might not be 100% correct but you should get the point.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM