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