For the reuse of software to become routine, it is essential that all modules have well-defined interfaces, and that all users of these modules respect these interfaces.
This paper examines the interfaces in object-oriented programs. It uses the notion of delegation, which can be thought of as underlying all inheritance mechanisms, to provide a framework for the examination of encapsulation mechanisms in object-oriented languages. Using delegation, the encapsulation mechanisms in class-based languages are reviewed, and suggestions are made as to how they might be improved.
Here's the PostScript source.