The goal of this lab is to write several classes that have the same interface and thus can be used interchangeably.
As in previous assignments, move into your cs235 directory.
Make a directory for this assignment, and change into it.
cd cs235 mkdir lab9 cd lab9
Copy the files ShapeDriver.java
and Shape.java from the public directory
for this class:
cp /homeemp/tvandrun/pub/235/Shape.java . cp /homeemp/tvandrun/pub/235/ShapeDriver.java .
If two or more classes have a common set of public methods (that is, they share or have an overlapping interface), then in theory they can be used interchangeably. This lab will lead you through steps that will show you how Java allow this in practive.
The example in this lab is a program using various kinds of shapes. (Imagine a graphics editor, like MS Paint.) The program may have many shape objects which it will need to draw and calculate area and perimeter for. It will need a set of operations that will be defined for all kinds of shapes. This is where subtyping comes into good use.
Open the files you copied, if you haven't already.
An interface Shape is already written for you.
You will be writing several classes that implement this interface.
You will not change the interface at all;
the only changes you will make to the driver will be to un-comment
code as you write new things to be tested.
Notice that the driver has the line
Shape currentShape = null;
This means the variable currentShape has type Shape,
so it can refer to anything that is a Shape.
Since Shape is not a class, there aren't any instances of it.
However, any instance of any class that implements the Shape
interface is also a shape, because those classes are subtypes
of type Shape.
At compile time, the variable currentShape is known to have
type Shape (this is called its static type), but when you
run the program, that variable will actually refer to an object
that has a more specific type (this is called its dynamic type).
Open a new file Circle.java
And write a class Cricle.
Declare it to implement the interface Shape.
public class Circle implements Shape {
This declaration does two things:
Shape interface.
In this case, your Circle class must have methods with signatures
double perimeter() and double area(), or
the compiler won't accept it.
Circle
can be stored in a variable of type Shape
Think about what instance variables you'll need to keep information
about a specific circle.
The call to the constructor in the driver expects to be passing the
radius to the Circle it's creating, if that gives any clue.
Write an appropriate constructor. Finally, write methods
area and perimeter,
as the interface expects.
(Disregard the fact that for circles, the perimeter is properly called
the circumference).
Use proper access modifiers (that is, public and private).
Then un-comment the part of the switch statement that deals with circles and test (don't uncomment the rest of the switch--- it refers to rectangles and right triangles, which you haven't done yet.
Also... document before going on. Don't leave it all for the end.
Once you have circle working right, do the same thing for
new classes Rectangle and RightTriangle.
Then un-comment the rest of the switch and test.
This part doesn't require you to do any more programming. Just uncomment the next section in the driver, the part using an array of shapes. Notice that since every circle, rectangle, and right triangle is also a shape, a shape array can hold any of them. Test this out and make sure you understand what's going on before moving on.
Now, what if we made a really complicated shape, one that is composed of other shapes, say
Call a tri-shape a shape that is composed of three other
shapes. Write a new class TriShape to model
such a shape.
Its component shapes should be anything that implements the
Shape interface.
The constructor should receive three Shapes as
parameters.
In implementing area and perimeter,
you can assume that the shapes do not overlap nor
share any edge.
Uncomment the rest of the driver and test.
Create the script file as before (cat, rm, compile, and run). Print it out and hand in a hard copy.
> a2ps -P sp (the name of the script file)
(This will print "two up", meaning two pages shown next to each other
on one pice of paper. If you use a2ps on a Java file, it
will format it nicely like in the handouts I've given in class.
The command lpr works similarly except it does no formatting
and doesn't print two up by default.)