Finally, Seeing the Polymorphism in Action
The chapter has taken the long way and demonstrated two implementations of a game class and a piece class. Listing 6-12 shows the code in the main form of the PCOpponent solution, which you can find in the source code that accompanies the book.Listing 6.12: Calling an Implementation of an Interface Polymorphically
Private aGame As IPCOpponentGame
Private Sub mTic_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles mTic.Click
aGame = New TicTacToeGame(Me)
SetupGame()
End Sub
Private Sub mReversi_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles mReversi.Click
aGame = New ReversiGame(Me)
SetupGame()
End Sub
Private Sub SetupGame()
With aGame
AddHandler .PlayerWon, AddressOf PlayerWon
AddHandler .ComputerWon, AddressOf ComputerWon
AddHandler .NobodyWon, AddressOf NobodyWon
AddHandler .BadMove, AddressOf BadMove
AddHandler .CurrentScore, AddressOf UpdateScores
.StartGame()
End With
Me.Invalidate()
End Sub
In this code, the variable aGame is declared as being of the game interface type. If you’ll recall, this isn’t really saying “The variable aGame is an instance of class x.” Instead, it’s really saying “The variable aGame is an instance of some class that implements interface x.” Once declared in this way, the program can use this variable to store either an instance of the ReversiGame class or the TicTacToe game class, and it can access any of the members of these classes polymorphically (as long as these members are part of the interface).