I have a base class, Sport, that has a property will return the proper type of object it should be for a given derived type (for example, Billiards extends Sport, and the property would return the BilliardBall type).
Is there a better way to do this than having a large if statement in the Sport class (if this object is a Billiards instance then return BilliardBall, else if…)?
Why are you talking generics here? And why is Sport knowing about all the sports there are?
You can do something like below, for starters: