Subtyping, also known informally as inheritance, is an important notion in object-oriented programming, but may lead to unexpected problems if not handled properly. In order to ensure that intrinsic properties are preserved during the process of subtyping, Liskov and Wing propose two approaches. First, a constraint approach directly specifies history properties in terms of constraints, which provides the criteria to ensure that every method in the subtype preserves the properties of the supertype. Second, an extension approach specifies that the observable behaviors of every new method in the subtype must agree with the original methods of the supertype. This in turn ensures that history properties are preserved. Liskov and Wing discuss these two approaches in detail with respect not only to constraint and extension rules, but to invariant, signature, and methods rules.
I have two observations. First, can the rules discussed in this paper be compatible with overriding? For example, can we identify a set of rules that will help us preserve the desirable properties of the supertype, while avoiding the undesirable properties? Second, I do not think the authors should claim that theirs is “the first work to deal with history properties.” For example, Cusack studied the history properties of inheritance in terms of traces, failures, and divergences in a communicating sequential processes (CSP) context .
I enjoyed reading this paper. Numerous convincing examples are given to illustrate the arguments. The paper should be read not only by researchers but also by programmers who may not normally concur with the usefulness of formal methods.