Giving partial access to a class using an interface
The solution is an interface. While it is possible to pass a reference of the GameEngine from GameEngine, to GameState this isn't desirable. What we need is a way to give GameState, direct but limited control. If it had a full reference to GameEngine it is likely that as the project progressed it would end up creating problems because GameState had too much access to GameEngine. For example, what if GameState decided to pause the game at the wrong time?
Interface refresher
If you think back to Chapter 8, Object-Oriented Programming, an interface is a class without any method bodies. A class can implement an interface and when it does, it must provide the body (including the code) for that method or methods. Furthermore, when a class implements an interface it is an object of that type. When a class is a specific type it can be used polymorphically as that type even if it is other types as well. Here are some examples of this phenomenon...