The
old way of
re-using existing programs
- Suppose
we
need to
write a Rectangle class
and we found
the
Circle class
that looks
similar:
public class Circle
{
private String color;
private double radius;
Circle(String col, double r)
{
color = col; radius = r;
}
public String getColor() { return color; }
public void setColor(String c) { color = c; }
public double getRadius() { return radius;}
public void setRadius(double r) { radius = r; }
public double getArea()
{
return 3.14159*radius*radius;
}
}
|
public class Rectangle
{
We need to write this class
}
|
|
Comment 1:
I have
simplified the
example in the
text book
(uses fewer
variables and
methods)
The
old way of
re-using existing programs
- The old way is to
(1)
copy the
Circle class
and then (2)
make
changes to
the variables and
methods:
public class Circle
{
private String color;
private double radius;
Circle(String col, double r)
{
color = col; radius = r;
}
public String getColor() { return color; }
public void setColor(String c) { color = c; }
public double getRadius() { return radius;}
public void setRadius(double r) { radius = r; }
public double getArea()
{
return 3.14159*radius*radius;
}
}
|
public class Rectangle
{
private String color;
private double width;
private double height;
Rectangle(String col, double w, double h)
{
color = col; width = w; height = h;
}
public String getColor() { return color; }
public void setColor(String c) { color = c; }
public double getWidth() { return width;}
public void setWidth(double r) { width = r; }
public double getHeight() { return height;}
public void setHeight(double r) { height = r; }
public double getArea()
{
return width*height;
}
}
|
|
Comment 1:
I have
simplified the
example in the
text book
(uses fewer
variables and
methods)
An object oriented design example
-
Notice:
there are
duplication of
variable definitions and
methods in the
program:
public class Circle
{
private String color;
private double radius;
Circle(String col, double r)
{
color = col; radius = r;
}
public String getColor() { return color; }
public void setColor(String c) { color = c; }
public double getRadius() { return radius;}
public void setRadius(double r) { radius = r; }
public double getArea()
{
return 3.14159*radius*radius;
}
}
|
public class Rectangle
{
private String color;
private double width;
private double height;
Rectangle(String col, double w, double h)
{
color = col; width = w; height = h;
}
public String getColor() { return color; }
public void setColor(String c) { color = c; }
public double getWidth() { return width;}
public void setWidth(double r) { width = r; }
public double getHeight() { return height;}
public void setHeight(double r) { height = r; }
public double getArea()
{
return width*height;
}
}
|
|
Duplication
makes program maintainance
very difficult
(when you make a change, you may need to change
in many places)
Test program on
Circle
and
Rectangle
objects
public class myProg
{
public static void main(String[] args)
{
Circle c1 = new Circle("red", 2);
Circle c2 = new Circle("blue", 4);
Rectangle r1 = new Rectangle("green", 2, 3);
Rectangle r2 = new Rectangle("red", 1, 4);
System.out.println( c1.getColor() + " " + c1.getArea() );
System.out.println( c2.getColor() + " " + c2.getArea() );
System.out.println( r1.getColor() + " " + r1.getArea() );
System.out.println( r2.getColor() + " " + r2.getArea() );
}
}
|
DEMO:
demo/04-inheritance/04-copy+paste
Let's see
how we can
define a
suitable
superclass for
Circle and
Rectangle
that allow us to
remove
duplication !
An object oriented design example
- We find the
common (shared)
properties and
actions:
public class Circle
{
private String color;
private double radius;
Circle(String col, double r)
{
color = col; radius = r;
}
public String getColor() { return color; }
public void setColor(String c) { color = c; }
public double getRadius() { return radius;}
public void setRadius(double r) { radius = r; }
public double getArea()
{
return 3.14159*radius*radius;
}
}
|
public class Rectangle
{
private String color;
private double width;
private double height;
Rectangle(String col, double w, double h)
{
color = col; width = w; height = h;
}
public String getColor() { return color; }
public void setColor(String c) { color = c; }
public double getWidth() { return width;}
public void setWidth(double r) { width = r; }
public double getHeight() { return height;}
public void setHeight(double r) { height = r; }
public double getArea()
{
return width*height;
}
}
|
|
•
We define a
super class with all the
common members
An object oriented design example
- We define
a superclass that
contains
the
common (shared)
properties
and
actions
in all
classes
(i.e.: Circle and
Rectangle:
public class GeometricObject
{
private String color;
GeometricObject( ) { } // Constructor 1
GeometricObject( String col ) // Constructor 2
{
color = col;
}
public String getColor() { return color; }
public void setColor(String c) { color = c; }
public double getArea() // Dummy method !!
{
return 0; // Some default value
}
}
|
|
Comment:
some
methods in the
superclass
may not have
a useful
method body ---
it's OK.
We will learn later this
it is very useful for the
polymorphism mechanism !!
An object oriented design example
- We change the
Circle
and Rectangle
classes and
make them
extend the
superclass
GeometricObject:
public class Circle extends GeometricObject
{
private String color;
private double radius;
Circle(String col, double r)
{
color = col; radius = r;
}
public String getColor() { return color; }
public void setColor(String c) { color = c; }
public double getRadius() { return radius;}
public void setRadius(double r) { radius = r; }
public double getArea()
{
return 3.14159*radius*radius;
}
}
|
public class Rectangle extends GeometricObject
{
private String color;
private double width;
private double height;
Rectangle(String col, double w, double h)
{
color = col; width = w; height = h;
}
public String getColor() { return color; }
public void setColor(String c) { color = c; }
public double getWidth() { return width;}
public void setWidth(double r) { width = r; }
public double getHeight() { return height;}
public void setHeight(double r) { height = r; }
public double getArea()
{
return width*height;
}
}
|
|
•
The classes will
inherit:
(1) color,
(2) getColor(),
(3) setColor() and
(4) getArea()
An object oriented design example
- The
String color
instance variable is
the same as
the superclass (GeometricObject)
and we can remove the
definition:
public class Circle extends GeometricObject
{
private double radius;
Circle(String col, double r)
{
color = col; radius = r;
}
public String getColor() { return color; }
public void setColor(String c) { color = c; }
public double getRadius() { return radius;}
public void setRadius(double r) { radius = r; }
public double getArea()
{
return 3.14159*radius*radius;
}
}
|
public class Rectangle extends GeometricObject
{
private double width;
private double height;
Rectangle(String col, double w, double h)
{
color = col; width = w; height = h;
}
public String getColor() { return color; }
public void setColor(String c) { color = c; }
public double getWidth() { return width;}
public void setWidth(double r) { width = r; }
public double getHeight() { return height;}
public void setHeight(double r) { height = r; }
public double getArea()
{
return width*height;
}
}
|
|
•
Note:
because
color is
private in
GeometricObject,
you must use its
accessor/mutator methods to
use the
variable
color
An object oriented design example
- The
getColor()
and
setColor()
methods are
the same as
the superclass (GeometricObject)
and we can remove the
definition:
public class Circle extends GeometricObject
{
private double radius;
Circle(String col, double r)
{
color = col; radius = r;
}
public double getRadius() { return radius;}
public void setRadius(double r) { radius = r; }
public double getArea()
{
return 3.14159*radius*radius;
}
}
|
public class Rectangle extends GeometricObject
{
private double width;
private double height;
Rectangle(String col, double w, double h)
{
color = col; width = w; height = h;
}
public double getWidth() { return width;}
public void setWidth(double r) { width = r; }
public double getHeight() { return height;}
public void setHeight(double r) { height = r; }
public double getArea()
{
return width*height;
}
}
|
|
•
Note:
because
getColor()/getColor() is
public in
GeometricObject,
you can use them
directly
!
An object oriented design example
- The
getArea()
method is
different from
the GeometricObject,
so
we
override
it with a new
getArea() in
the subclass:
public class Circle extends GeometricObject
{
private double radius;
Circle(String col, double r)
{
color = col; radius = r;
}
public double getRadius() { return radius;}
public void setRadius(double r) { radius = r; }
public double getArea() // Overrides
{
return 3.14159*radius*radius;
}
}
|
public class Rectangle extends GeometricObject
{
private double width;
private double height;
Rectangle(String col, double w, double h)
{
color = col; width = w; height = h;
}
public double getWidth() { return width;}
public void setWidth(double r) { width = r; }
public double getHeight() { return height;}
public void setHeight(double r) { height = r; }
public double getArea() // Overrides
{
return width*height;
}
}
|
|
•
Note:
because
getColor()/getColor() is
public in
GeometricObject,
you can use them
directly
!
An object oriented design example
- There is one problem:
(can you spot it ?)
public class Circle extends GeometricObject
{
private double radius;
Circle(String col, double r)
{
color = col; radius = r;
}
public double getRadius() { return radius;}
public void setRadius(double r) { radius = r; }
public double getArea() // Overrides
{
return 3.14159*radius*radius;
}
}
|
public class Rectangle extends GeometricObject
{
private double width;
private double height;
Rectangle(String col, double w, double h)
{
color = col; width = w; height = h;
}
public double getWidth() { return width;}
public void setWidth(double r) { width = r; }
public double getHeight() { return height;}
public void setHeight(double r) { height = r; }
public double getArea() // Overrides
{
return width*height;
}
}
|
|
•
Problem:
color
is private in
GeometricObject and
cannot be
accessed
directly
An object oriented design example
- Replace all
direct access to
private members
in superclass with
calls to
accessor/mutator methods:
public class Circle extends GeometricObject
{
private double radius;
Circle(String col, double r)
{
setColor(col); radius = r;
}
public double getRadius() { return radius;}
public void setRadius(double r) { radius = r; }
public double getArea() // Overrides
{
return 3.14159*radius*radius;
}
}
|
public class Rectangle extends GeometricObject
{
private double width;
private double height;
Rectangle(String col, double w, double h)
{
setColor(col); width = w; height = h;
}
public double getWidth() { return width;}
public void setWidth(double r) { width = r; }
public double getHeight() { return height;}
public void setHeight(double r) { height = r; }
public double getArea() // Overrides
{
return width*height;
}
}
|
|
•
Notice:
now there is
no duplication of
variable defintions or
methods !
Test program on
Circle
and
Rectangle
objects
public class myProg
{
public static void main(String[] args)
{
Circle c1 = new Circle("red", 2);
Circle c2 = new Circle("blue", 4);
Rectangle r1 = new Rectangle("green", 2, 3);
Rectangle r2 = new Rectangle("red", 1, 4);
System.out.println( c1.getColor() + " " + c1.getArea() );
System.out.println( c2.getColor() + " " + c2.getArea() );
System.out.println( r1.getColor() + " " + r1.getArea() );
System.out.println( r2.getColor() + " " + r2.getArea() );
}
}
|
DEMO:
demo/04-inheritance/05-OOD
This test program
works like before !!!
❮
❯