IAT 265 OO programming - Inheritance ______________________________________________________________________________________ 1

advertisement
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
Download