So, the customary solution in singly dispatched object oriented languages to this problem is to employ an idiom known as “double dispatch(ing)”.

Multiple dispatch was first described in a classic OOPSLA ’86 paper by Smalltalk master-coder Dan Ingalls. Kurt Hebel and Ralph Johnson produced a nice, readable treatment of Double Dispatch about 12 years ago.

The code above illustrate how it works.

When an Irishman imbibes a Dram, he can’t be sure exactly what’s in it, but he knows for sure its been drunk by an Irishman.
He dutifully informs the Libation of this fact.

By virtue of this  second method invocation, true polymorphism is brought into play a second time.

And, sure and begora, the Irishman may not have been sure what he drank, but a Dram of IrishWhisky knows just what to do when its inside an Irishman.

Of course, using double dispatch requires that you implement these ricochet / pinball bumper routines. In general, the number which must be implemented is potentially, but seldom actually, quite large. We’ll see just how large later in this presentation.