Advanced Programming I Lecture Notes

25 April 2006 • Liskov-Wing Substitution


Outline

Objects and ADTs

Design by Contract

Polymorphism

Squares and Rectangles

Implementing Rectangles

class rectangle

  double h, w

  rectangle(h, w) : h(h), w(w) { }

  virtual set_ht(h) { h = h }
  virtual set_wd(w) { w = w }
  double get_height() { return h }
  double get_wd() { return w }

  double area() { return h*w }

Implementing Squares

class square : rectangle

  square(s) : h(s), w(s) { }

  set_ht(ht)
    h = w = ht

  set_wd(wd)
    h = w = wd

Class Invariants

Testing Invariants

void test(rectangle r)

  r.set_wd(4)
  r.set_ht(5)
  assert 4 == r.get_wd() ∧ 5 == r.get_ht()
  assert 20 == r.area()

  r.set_wd(4)
  r.set_ht(3)
  assert 4 == r.get_wd() ∧ 3 == r.get_ht()
  assert 12 == r.area()

Testing the Test

int main()
  test(new rectangle(1, 1))  // pass.
  test(new square(1))	     // fail.

The Principle

The Principle Unpacked

Rectangle-Square Reconsidered

Consequences

Behavioral Subtyping

Some Issues

Design by Contract

The Rectangle Contract

The Square Contract

Parent-Child Contracts

References


This page last modified on 25 April 2006.

This work is covered by a
Creative Commons License.