the problem your having with OO is sort of why component systems came in to existence - instead of having private variables with getters and setters you can have a set of "components" which all have their own data and systems to handle them..
ie if you wanted a tree you might make a game object (that lets you have a vector of components possibly) and attach a "render" component which has info about the mesh (or image/texture if 2d), if you wanted the tree to have collision you might attach a "collider" component, if you want to make the tree have anything you make a component for that thing you want it to have.. then you change the variables of those components within systems that you make to handle them - ie RenderSystem handles the render component of every game object - a single system can use and act on any amount of components you want
then rather than having so many game object types you really rely on one type that just lets you add and remove components - if you want some type of new behavior available you can make a new component type and add a handling case to either one of your existing systems or make a new system for handling it
ie - if you want objects to be able to have health, mana, attack, defense you could make a component for each set of data and make a "CombatSystem" which handles these components
by the way "components" in general are just structs of data so there are no getters and setters - I have seen classes too but usually these classes still have the main component variables as public.. you can do it however you want - maybe you want all components to have a function to clear their contents or something - thats fine
I have done a lot of OO games and I really prefer the composition style much more - just my experience though.. kind of a pain to get started with it but once you have it working its really easy to add new stuff/behavior to the game objects