A couple of questions /suggestions.
- Why is
SimpleTypeD
an abstract class instead of a trait? - Do you really need constructors for the implementations? You can juts put all the arguments as abstract
val
/def
that are overridden by the case classes. - About terminology, I would call the traits / abstract classes that contain the implementation of the case classes
FooImpl
because even if abstract they contain the implementation; also remember to make themprivate
to the package, and use self-types to ensure you do not mix or expose them.