@PepijnKramer:
use interfaces/dependency injection and inversion of control to keep your design as loosely coupled as possible
I think the initial design above does use dependency injection? Or maybe I misunderstand what that means. The derived FeatureDefaultImpl class uses a constructor to allow the settings class to be injected in, but FeatureBase and SettingsBase are already uncoupled. Could you clarify what you meant?