Overall, these classes provide definitions that could be described as dumb data objects. They provide little or no functionality that isn't directly related in some fashion to the definition and regulation of a specific data structure. Even HasProducts, and the classes that derive from it, fall into this category since the functionality provided there is strictly concerned with providing a data structure and controlling how that structure can be manipulated. As other classes are created that derive from these classes, those classes will start to become smarter, starting with persistence of the data for individual objects.
First, though, unit tests for these classes need to be written, to assure that they have been tested, and that they can be retested on demand. Since that represents a significant shift in coding goals, and will involve some...