Try implementing message passing. One can certainly make a Set a subclass of a Bag, but doing so leads to very subtle problems. The page above demonstrates the problems in all the gory details.
Every set is also a bag.
The page above shows how easy things become, and how the subtle subclassing problems become simply impossible. The pages show that OOP actually hinders the separation of interface from implementation rather than promotes it. Message passing is a term most often associated with Smalltalk. A good paper to read would be The Smalltalk-76 Programming System Design and Implementation by Dan Ingalls. It describes how message passing worked in an early Smalltalk implementation, and gives a pretty good description of the overall language.