// method adding observer to a game object public void AddObserver(Subject.Name name, GameObject go) { Observer raw = (Observer)this.PullFromReserved(); // adding derived observer based on name if (name == Subject.Name.LeftKey || name == Subject.Name.RightKey) { // for left key and right key event // create a move observer to listen MoveObserver mo = (MoveObserver)raw; mo.set(name, (MoveProxy)go.pProxy); // downcasting dangerous // Add new observer to the list this.Add(mo); } }