Can I get dependent services into a custom class without creating a service? I've got a class hierarchy where I need to be able to instantiate different objects within the hierarchy.  Instead of using global functions, I'd like to use injected services from the container via $this within those objects.

When researching this, it seems as though the only examples I can find involve creating a service, such as Dependency injection in a custom class.  However, I don't need a new service.  If I did create one, wouldn't I need to create one for every class within the hierarchy so that they could be instantiated?  This seems excessive.

If my parent class implements ContainerInjectionInterface and I have a create() method to inject the services, can I just instantiate the objects this way, or is it bad practice?

$thing = OneOfMySubClasses::create(\Drupal::getContainer(), ...);
Not sure how many classes/services you have, but the main point for having services is to have the dependencies injected. Drupal core alone has probably 100+ services, so I wouldn't worry too much about adding 10 or so more.

Using ContainerInjectionInterface is also fine, if you do that, you can use the class_resolver service that will take care of doing that, it also accepts both a class implementing that interface as well as a service name.

https://api.drupal.org/api/drupal/core%21lib%21Drupal.php/function/Drupal%3A%3AclassResolver/8.4.x

Depending on how you use/configure/decide which of your classes to you, you could also make a plugin type and make them plugins, e.g. like block plugins or field formatters.