How to maximize the sharing of properties and/or actions among classes

  • We have learned to use a class to model objects of the same type.

    Example:

      • The Circle class models objects that are round in shape

      • The Rectangle class models objects that have 4 sides and 4 right angles

  • Different classes can have common properties and/or behaviors (= actions)

    Example:

      • Circles and rectangles can both have the color property

      • Circles and rectangles can both have the getArea() behavior (= action)

  • To maximize sharing of common properties/behaviors, we "generalize" different classes into a larger ("super") class - how ? - explained next

How to generalize classes with common properties/actions

  • Consider a group of cats and a group of dogs "objects":

  • $64,000 question:

      • How can we generalize the cats and dogs ?

How to generalize classes with common properties/actions

  • A cat is a animal --- A dog is a animal

  • Answer:

      • The is-a generalization method will give us the maximum sharing of properties and actions

What do cats and dogs and other animals share ?

  • Properties:

      • numOfLegs:   dogs, cats: 4,   chickens: 2,   spider: 8
      • numPairOfWings:   dogs, cats: 0,   chickens: 1,   dragenfly: 2.
      • And so on

  • Actions:

      • sound():   dogs: "Woof",   cats: "Maio",   chickens: "Cluck"
      • travelSpeed():   dogs: 35 mph,   cats: 30 mph,   cheetah: 60 mph.
      • And so on


  • Programming practice:

      • The Object Oriented Design methodology uses the is-a generalization technique to achive maximal sharing of properties and actions between classes

How to generalize classes with common properties/actions

  • Now consider circle and rectangle objects:

  • $64,000 question:

      • How can we generalize circles and rectangles ?

How to generalize classes with common properties/actions

  • A circle is-a geometric shape --- A rectangle is-a geometric shape

  • Answer:

      • Geometric shapes are closed figures created using points, line segments, circles, and curves.

What do circles and rectangles and other geometric shapes share ?

  • Properties:

      • color:   each shape can have its own color
      • numOfSides:   circle, oval: 0,   triangle: 3,   rectangle: 4.
      • And so on

  • Actions:

      • getArea():   returns the area of the geometric shape
      • getPerimeter():   returns the perimeter of the geometric shape
      • And so on

How to design the class hierarchy using the is-a generalization technique

  • First, determine all the program classes that you will need to solve the problem:

     

  • Determine the properties and actions that are needed in each class

How to design the class hierarchy using the is-a generalization technique

  • Then, generalize similar program classes using the is-a generalization:

     

  • Use the properties and actions in each class to find the "More general classes

How to design the class hierarchy using the is-a generalization technique

  • If possible, generalize further:

     

  • Use the final hierarchy to determine the properties and actions of each class

Terminology:    superclass and subclass

  • Superclass = the more general class in the is-a relationship (a.k.a.: parent class)

  • Subclass = the more specific class in the is-a relationship (a.k.a.: child class)

    Example:

Characteristics:    superclass and subclass

  • A superclass has a number of properties and actions

  • Every object of the subclass will have all the properties and actions in the superclass

  • In addition, the subclass object can have other properties and actions not found in the superclass

    Example:

    A Circle has all properties of GeometricObject plus the property radius

How to define a subclass of some superclass in Java

                

  public class GeometricObject
  {
     private String color;
     private int numSides;

     public double getArea() { .... }
     public double getPerimeter() { .... }
  }

  public class Circle extends GeometricObject // "inherits"
  {
     private double radius; // Add more properties...
  }

  public class Rectangle extends GeometricObject  // "inherits"
  {
     private double width;  // Add more properties...
     private double height;
  }