IAT 265
OO programming - Inheritance
______________________________________________________________________________________
SCHOOL OF INTERACTIVE ARTS + TECHNOLOGY [SIAT] | WWW.SIAT.SFU.CA
IAT 265
1
Outline
Object-oriented programming
– objects
– classes
• sets (mutators) and gets (accessors)
• object methods
– Inheritance: Subclasses
• Rocket, ArmedRocket
Collections
– ArrayList
June 9, 2015
IAT 265
2
Inheritance
June 9, 2015
IAT 265
3
Classes
Types
– Primitives: int, float, char, boolean …
– Objects: array, string, class …
June 9, 2015
IAT 265
Objects
We’ve
worked with some objects before,
like Arrays.
We can make our own objects, to keep
related data together, with methods to
control that data.
June 9, 2015
IAT 265
Classes
Classes
are the blueprints for our new
objects.
To declare a new Class (a new type of
object):
class MyToy {
// fields (class variables)
// methods (class functions)
}
June 9, 2015
IAT 265
Fields and Methods
class MySquare {
int xPos, yPos;
MySquare(x, y) {
xPos = x;
yPos = y;
}
fields
x
constructor
drawMe()
(one kind
of method)
void drawMe() {
rect(xPos, yPos, 50, 50);
}
methods
}
June 9, 2015
y
IAT 265
Fields and Methods
x
class MySquare {
int xPos, yPos;
y
drawMe()
MySquare(x, y) {
xPos = x;
yPos = y;
}
void drawMe() {
rect(xPos, yPos, 50, 50);
}
10 10
drawMe()
}
square1
MySquare square1 = new MySquare(10, 10);
MySquare square2 = new MySquare(20, 90);
June 9, 2015
IAT 265
20 90
drawMe()
square2
Fields and Methods
x
class MySquare {
int xPos, yPos;
drawMe()
MySquare(int x, int y) {
xPos = x;
yPos = y;
}
10 10
drawMe()
void drawMe() {
rect(xPos, yPos, 50, 50);
}
square1
}
MySquare square1 = new MySquare(10, 10);
MySquare square2 = new MySquare(20, 90);
square1.drawMe();
square2.drawMe();
June 9, 2015
y
IAT 265
20 90
drawMe()
square2
Arrays of Objects?
Let’s
make a bunch of squares!
MySquare[] squares = new MySquare [10] ;
// initialize all of our squares.
for (int i = 0; i < 10; i ++) {
squares[i] = new MySquare(i*10, i*10);
}
squares[4].drawMe();
June 9, 2015
// draw the 4th square.
IAT 265
Recap: Rocket
Earlier,
we created the Rocket class
– Constructor:
Rocket(int initialX, int initialY, float initialRot )
– Methods
draw()
rotateClockwise()
rotateCounterClockwise()
fireThrusters()
June 9, 2015
IAT 265
Asteroids
Let’s
adapt this to make an array of
Asteroids for our Rocket
class Asteroid {
//fields
float rotation = 0;
float xPos, yPos;
float velocityX, velocityY;
long lastDrawMillis = 0;
…
}
June 9, 2015
IAT 265
Asteroids
When
we create an asteroid, let’s have it
start in a random position, and move in a
random direction.
class Asteroid {
…
// constructor
Asteroid() {
xPos = random(0, 400);
yPos = random(0, 400);
rotation = random(0, TWO_PI);
velocityX = sin(rotation)*10;
velocityY = -cos(rotation)*10;
}
June 9, 2015
IAT 265
Asteroids
class Asteroid {
…
// draw method
void draw () {
June 9, 2015
IAT 265
Revisit our example
So far we have a rocket that flies around in a
field of asteroids
What if we want our rocket to be able to fire
– But we don’t want to get rid of our non-firing rocket
Create a subclass!
June 9, 2015
IAT 265
Inheritance
Subclasses
inherit fields and methods
from parent
class ArmedRocket extends Rocket
{
…
}
June 9, 2015
IAT 265
Our subclass needs a
constructor
Our empty ArmedRocket example creates an error
– Processing doesn’t know how to construct an ArmedRocket
We want the ArmedRocket constructor to do the same
work as the Rocket constructor
ArmedRocket(int initialX, int initialY,
float initialRot) {
super(initialX, initialY, initialRot);
}
The keyword super means to refer to the parent class.
In this case, to call the Parent Class Constructor
June 9, 2015
IAT 265
Now we have ArmedRocket
We
can use an ArmedRocket now in our
example
But,
it’s basically just a copy of Rocket
The
only reason to define an
ArmedRocket is to add new capabilities or
to override old ones
June 9, 2015
IAT 265
Add a fire() method
We
want our fire method to draw a
missile that shoots out of the rocket
We
could have the fire method draw the
missile…
– Is there a problem with this?
June 9, 2015
IAT 265
Missiles should also be objects
The object oriented solution is to make the missile an
object as well
– All the different types of “things” in our domain should
have a corresponding class
Like asteroids and rockets, the missile class should know
how to draw itself
– A Missile is similar to a rocket (position, rotation, draw
method, etc.)
Now our ArmedRocket.fire() method can just
create and return a missile
June 9, 2015
IAT 265
The fire() method
Missile fire()
{
Missile m = new Missile(xPos, yPos,
rotation);
return m;
}
Now
June 9, 2015
add code in loop to draw missiles
IAT 265
Missiles destroy asteroids
So far we have a rocket that flies around in a
field of asteroids and fires
Now we want our missiles to blow up asteroids
–
–
–
–
This means we need a variable number of asteroids.
How do we do this with an array?
Use an ArrayList!
Also need to figure out when we have a collision
June 9, 2015
IAT 265
22
The Java SDK
Java
comes with thousands of classes in
the Java Platform API
Documentation
website
Let’s
June 9, 2015
is available on Sun’s
look at ArrayList
IAT 265
23
ArrayList
It’s a resizeable list
– Can add and delete things without worrying about declaring the size
The main methods we care about are add(), get(), and
remove(), and size()
Steps in using ArrayList
– Declare a variable of type ArrayList
– Create a new ArrayList and assign it to the variable
– Call add(), get() and remove() and size() on ArrayList as you need
them
June 9, 2015
IAT 265
24
Parents and children
Remember that we declared a child class ArmedRocket whose parent
was Rocket
Remember that classes are types
– So ArmedRocket is a type and Rocket is a type
So, here are some legal assignments
– ArmedRocket r1 = new ArmedRocket(50, 60, 0);
– Rocket r2 = new Rocket(50, 60, 0);
– Rocket r3 = new ArmedRocket(50, 60, 0);
But this is illegal
– ArmedRocket r4 = new Rocket(50, 60, 0);
Same goes for method arguments as well…
June 9, 2015
IAT 265
25
Rocket Inheritance
Rocket:
xPos, YPos, velocityX, velocityY, rotation
Rocket(x,y,rotation) draw()
Inherits from
ArmedRocket extends Rocket
xPos, YPos, velocityX, velocityY, rotation
ArmedRocket(x,y,rotation) draw() fire()
June 9, 2015
IAT 265
26
Using ArrayList.add()
The argument type of the add method is Object
– Object is the parent class of all classes
– With an object argument type, you can pass in an
object of any class
So, to initialize our asteroids…
ArrayList asteroids = new ArrayList();
for(int i = 0; i < numAsteroids; i++)
asteroids.add(new Asteroid());
June 9, 2015
IAT 265
27
Getting things out of an
ArrayList
i) – returns the
ith object (starting with 0)
ArrayList.get(int
But
this doesn’t work!
asteroids.get(i).draw();
Why?
June 9, 2015
IAT 265
28
Need to cast back from Object
Since things are put in an ArrayList as Object,
they come back out as Object
– It’s like they forget their more detailed type
– So, when using ArrayList (or any container class),
need to cast back to the more detailed type
Asteroid asteroid =
(Asteroid)asteroids.get(i);
if (!asteroid.collision(r1))
asteroid.draw();
June 9, 2015
IAT 265
29
Pushing collision detection
into the Asteroid
In the current code, detecting collision takes place in loop()
But it is cleaner (more object-oriented) if Asteroid itself knows how
to detect collision
– Detecting collision depends on knowing the boundaries of the asteroid,
which properly belongs in the asteroid class
boolean collision(Rocket r)
{
if ((r.xPos >= xPos - 26 && r.xPos <= xPos + 22) &&
(r.yPos >= yPos - 24 && r.yPos <= yPos + 26))
return true;
else
return false;
}
June 9, 2015
IAT 265
30
Destroying asteroids
When a missile hits an Asteroid, we need to destroy it
– This was the whole reason for using ArrayList
– Big asteroids turn into two small asteroids
– Small asteroids disappear
void destroy(ArrayList asteroids) {
asteroids.remove(this);
if (large) {
asteroids.add(new Asteroid(false, xPos, yPos, lastDrawMillis));
asteroids.add(new Asteroid(false, xPos, yPos, lastDrawMillis));
}
}
June 9, 2015
IAT 265
31
Super and this
this is a special variable that always refers to the
current instance (object)
– Useful in methods to refer to yourself
– this.method() – calls a method on yourself (but normally you just
directly call the method)
– this() – calls a constructor on yourself (useful for one version of a
constructor to call another)
super is a special variable that always refers to the
superclass portion of an object (the object cast into
it’s superclass)
– super.method() – calls the superclass’s method
– super() – calls the superclass’s constructor
June 9, 2015
IAT 265
32
Summary
ArrayList, a Java Platform collection class
Learned about super and subclasses as types
– Any instance of a subclass is an instance of the
superclass, but not visa-versa
– Can cast more abstract classes (parents) into more
concrete classes (children)
The Java keywords super and this
– Special variables that can be used within a method to
refer to yourself (the superclass portion of yourself and all
of yourself)
June 9, 2015
IAT 265
33