Sealed Classes VS. Enum Classes VS. Sealed Interfaces - When to Use Which?