Some advice when working with object-oriented systems
Object-oriented programming allows for a lot of flexibility, but if it's used incorrectly, it can also cause a lot of confusion, since it's easy to develop very complex systems when much simpler solutions would suffice.
You should start a small working system before evolving it into more complex ones. Also, realize that most real-world designs are over-constrained, and you will not be able to please everyone, so you must decide on the priorities for your system.
Each part of your system should focus on a single thing, and doing that thing well. When in doubt, make shorter things. Make shorter classes and shorter methods. Doing so will force your objects to focus on a single responsibility, which will in turn improve your design and will allow you to reuse code more easily.
Make your objects as private as possible. Public classes should not have any public fields, that is, you should use encapsulation everywhere. Maximize information hiding...