This type of complexity is a common problem in object oriented programming. "This" type has a method that accepts a "that" type, and it works well until there are too many combinations of types. Any time a new "that" is created, the original code needs to be updated. This is where OOP reaches for in...