I am currently coding a game in Java. At the moment I have one interface with a few methods: getPosX, getPosY, whatAmI (returns the enum type of the object) and update.
This interface is extended by all world items be it enemy, player, gem (currency) or any other world item. The thing is, while the enemy and the player both require the update method, things like gem or other world items don’t require this update method. Since interfaces works like a contract, the classes that extend this interface WILL require the method. But this method will never be used for things like gems. To me, this is weird. The reason I have done this however, is so that I can put every world item (gem, player, enemy) into one single list of world item.
I am in the process of reviewing my code and realized that it might not be the best option to have dead methods for things like gems (i.e update method that does nothing), but that I should instead have two interface say, worldItem and then for enemy and player, I have another interface which inherits from worldItems. That way, it would still be possible to put every world item into one single list. There is just one caveat to this. Whenever I want to loop through that list and call the update method, how would I do that?
If that one list contains every single worldItem (including gem, player and enemy), whenever I loop through the list and I get a worldItem that is player, I would not be able to call the update method on that element SINCE the update method belongs to another interface further down the inherit tree.
My question is, how would I go around this problem without adding more code? Is it even possible without separating the two interfaces into two different lists (i.e one with just player and enemies and the other with other world items)?
TL;DR: Two interfaces, one interface inherits from the other interface. The lowest interface contains an update method that is required for enemy and player, while the higher level interface contains general methods required for ALL world items.
I have one list that interfaces the higher level interface, that way ALL object fit into one list. When I loop through the list I want to be able to reach the update method for player (this method is in the lower level interface). But I also want access to other world items that do not have the update method, yet still interfaces the higher level interface.
What should I do?
I’ll add a visual representation of the inheritance tree and some pseudo-code to further highlight my ‘issue’
WorldItem [ getPosX() ] [ getPosY() ] [ whatAmI() ] / / V MovingObjects [ update() ] List<WorldItem> worldItems // arrayList that contains WorldItem (gem) and // MOvingObjects like player and enemy for(worldItem worldItem : worldItems) if(worldItem.whatAmI == PLAYER) worldItem.update()
This is what I would like to do, but obviously the WorldItem interface Does not have the update method, but the lower level interface does, of which the player implements
How would I go about doing this?