Date post: | 13-Dec-2015 |
Category: |
Documents |
Upload: | jessie-reeves |
View: | 218 times |
Download: | 4 times |
Peter Andreae
Computer Science
Victoria University of Wellington
Copyright: Peter Andreae, Victoria University of Wellington
Types and InterfacesCOMP 102 #29 2014
© Peter Andreae
COMP 102 29:2
Outline
• Multiple types• Interface classes• Implementing Interface classes.
Reading: • Textbook
• 9.3: Interfaces (note, textbook also discusses inheritance)
© Peter Andreae
COMP 102 29:3
Types again
Variables, fields, array elements are all defined with a type• Only values of the specified type can be put into a place
What types are there• primitive types: int, double, boolean, long, float, char, ..
note: java will "coerce" some types into other types:double number = 4;
• Object types:• Arrays : int[ ], double[ ][ ], Disk[ ], • Predefined: String, Color, File, Scanner, …• Programmer defined: CartoonFigure, Disk, DiskGame, …• Type of object determined at its creation:
• new Disk(100, 300) ⇒ a Disk object• new File ("data.txt") ⇒ a File object• new int[100][100] ⇒ an array of arrays
of int.• "Hello" ⇒ a String
Every class defines a type
© Peter Andreae
COMP 102 29:4
Object types
• All object values have two types:• the type they were created as• the Object type
• You can have a place of type Object:Object value = new Disk(100, 100);value = "not any more";
There are limits on what you can do with a place of type Object:
value.explode();
value.toUpperCase();
You can only call methods on the value in a variable/field if the methods belong to the type of the variable/field.
value.toString()
Won't work if value contains a String
Won't work if value contains a Disk
© Peter Andreae
COMP 102 29:5
Collections of different types
• Extending the Disk Game:• Have several kinds of Disks:
• ordinary Disks – get damaged, and explode after several shots
• bomb Disks – blow up immediately taking out lots of disks• fat disks – get smaller as get damaged, and don’t explode• bouncy disks – don't explode, but bounce around when
shot
TT
X
© Peter Andreae
COMP 102 29:6
New Disk Game
• DiskGame needs an array to hold all the disks
• Each class of disks needs the same methods:• damage, on, explode, etc• but, they each behave differently.
DiskGame
array of disks
RoundDisk
damage()on(int x, int y)explode()
BombDisk
damage()on(int x, int y)explode()
FatDisk
damage()on(int x, int y)explode()
BouncyDisk
damage()on(int x, int y)explode()
© Peter Andreae
COMP 102 29:7
DiskGame
public class DiskGame {:private int maxDisks = 20;private [ ] disks = new
[maxDisks];
public void hitDisk(int x, int y){for (int i = 0; i<disks.length; i++){
if (disks[i] != null && this.disks[i].on(x, y) ) { this.disks[i].damage(); :
RoundDisk-2 BombDisk-5FatDisk-8
BouncyDisk-3
RoundDisk-7
Java will complain!No such method for ObjectJava compiler will complain!No such method for Object
Can use ObjectCan use Object
Object Object
RoundDisk-3
FatDisk-12
© Peter Andreae
COMP 102 29:8
Different Disk classes
public class RoundDisk {private int x, y;private int radius = 10;private Color col; public void damage(int amt){…..public boolean on(int x, int y){…..
}public class FatDisk {
private int x, y;private int length = 10;private double direction = 1.26;private Color baseCol, tubeCol; public void damage(int amt){…..public boolean on(int x, int y){…..
}
© Peter Andreae
COMP 102 29:9
"Generic" values with Object
public class DiskGame {:private int maxDisks = 20;private Object [ ] disks = new Object [maxDisks];
public void hitDisk(int x, int y){for (int i = 0; i<disks.length; i++){
Object disk = this.disks[i];RoundDisk rd = (RoundDisk) disk;if (rd != null && rd.on(x, y) ) {
rd.damage();
Cast it to a RoundDiskNow compiler is happy
But if it is a BombDisk or… the program will fall over!
RoundDisk-2 BombDisk-5FatDisk-8
BouncyDisk-3
RoundDisk-7RoundDisk-3
FatDisk-12
© Peter Andreae
COMP 102 29:10
Casting
• Can sometimes convert a value from one type to another• numbers:
int col = (int) (x /cellWidth);double x = 100 * col;
• Must be an explicit cast if information might be lost.
• anything to a string: (by adding to a string)"value is " + x
• For an Object value, it automatically calls the toString() method
"value is " + x.toString()
• any object value from one of its types to anotherObject disk = (Object) ( new RoundDisk(34, 45) );RoundDisk rd = (RoundDisk) disk;
• object must be of that type, otherwise a runtime error
© Peter Andreae
COMP 102 29:11
"Generic" values with Object
public void hitDisk(int x, int y){for (int i = 0; i<disks.length; i++){
Object disk = this.disks[i];if (disk == null) { continue; }else if (disk instanceof RoundDisk) {
RoundDisk rd = (RoundDisk) disk;if (rd.on(x, y) ) { rd.damage();…..}
}else if (disk instanceof FatDisk) {
FatDisk fd = (FatDisk) disk;if (fd.on(x, y) ) { fd.damage();…..}
} …
RoundDisk-2 BombDisk-5FatDisk-8
BouncyDisk-3RoundDisk-7
null null
Not nice code!
© Peter Andreae
COMP 102 29:12
A Disk type
• RoundDisk, FatDisk, BombDisk, BouncyDisk are all kinds of Disk.⇒ should all be of a Disk type.
RoundDisk-2 should be a • a RoundDisk,• a Disk, and• an Object
public class DiskGame {
private int maxDisks = 20;private Disk [ ] disks = new Disk [maxDisks];
public void hitDisk (int x, int y){for (int i = 0; i<disks.length; i++){
Disk disk = this.disks[i];if (disk != null && disk.on(x, y) ) {
disk.damage();
© Peter Andreae
COMP 102 29:13
Making a Disk Type
• Problem: What is "a Disk" ?
• Answer 1:• Something you can
• damage, public void damage()• ask if a point is on it, public boolean on(int x,
int y)• explode public void explode()• ask for its score public double score()• ask if within range of disk public boolean
withinRange(Disk other)
• Answer 2:• a RoundDisk, or • a FatDisk, or• a BombDisk, or• a BouncyDisk.
• We need to make both answers true.
© Peter Andreae
COMP 102 29:14
Interface classes
• An interface class describes a supertype of other types. • It specifies
• a name for the type• the headers for the methods that any object of the type
can respond to.• constants (public static final double GRAVITY = 9.8)• nothing else! (no fields, constructors, or method bodies)
public interface Disk {method headersconstants
}
• You cannot make a new instance of an interface.
Disk b = new Disk();
An interface just says "what"; not "how"
© Peter Andreae
COMP 102 29:15
A Disk Interface class.
public interface Disk {public void damage();public boolean on(int x, int y);public void explode();public double score();public boolean withinRange(Disk other);
}
• Declares a type that you can use for fields,variables, arrays:
public class DiskGame {private int maxDisks = 20;private Disk [ ] disks = new Disk [maxDisks];public void hitDisk(int x, int y){
for (int i = 0; i<disks.length; i++){Disk disk = this.disks[i];if (disk != null && disk.on(x, y) ) {
disk.damage();
Java will NOT complain!Disks DO have these methods
Note the ; instead of { …. }
© Peter Andreae
COMP 102 29:16
Making a Disk Type
• Problem: What is "a Disk" ?
• Answer 1: Defined by interface Disk {• Something you can
• damage, • ask if a point is on it,• explode• ask for its score• ask if within range of another disk
• Answer 2:• a RoundDisk, or • a FatDisk, or• a BombDisk, or• a BouncyDisk.
• We need to make both answers true.
© Peter Andreae
COMP 102 29:17Making classes have another type• If you define some class,
• all instances are automatically of type Object also.
• To make instances be of some interface type:• declare that the class implements the interface type:• make sure that the class defines all the methods
specified by the interface type:
public class RoundDisk implements Disk {private int x, y;private int radius = 10; public void damage(int amt){ …… }public boolean on(int x, int y){ …… }public void explode() { …… }public double score() { …… }public boolean withinRange(Disk other) { …… }
}
Must provide method bodies,not just headers!
implements is a “promise” that these objects will be of the interface type. ie, will have all the methods.
© Peter Andreae
COMP 102 29:18More classes implementing Disk
public class FatDisk implements Disk {private int x, y;private int layers = 5; public void damage( ){ …… }public boolean on(int x, int y){ …… }public void explode() { …… }public double score() { …… }public boolean withinRange(Disk other) { …… }
}
public class BombDisk implements Disk {private int x, y, maxRad;private int radius = 10;public void damage(){ …… }public boolean on(int x, int y){ …… }public void explode() { …… }public double score() { …… }public boolean withinRange(Disk other) { …… }
}
© Peter Andreae
COMP 102 29:19
Making a Disk Type
• Problem: What is "a Disk" ?
• Answer 1: Defined by interface Disk {• Something you can
• damage, • ask if a point is on it,• explode• ask for its score• ask if within range of another disk
• Answer 2: Specified by … implements Disk• a RoundDisk, or • a FatDisk, or• a BombDisk, or• a BouncyDisk.
• We have now made both answers true.
© Peter Andreae
COMP 102 29:20
DiskGame class structure
•
RoundDiskdamage explode …
Disk
FatDiskdamage
explode …
BombDiskdamage explode …
BouncyDiskdamage explode …
DiskGame
User Interface
Array of Disk
© Peter Andreae
COMP 102 29:21
Interface class summary
• If you define an interface class:• You have defined a type
• You can declare variables (or arrays) to have that type.
• You cannot make an object of the interface class
new Disk(…) // NOT ALLOWED (there is no constructor)
• Objects from classes implementing the interface are of that type.
• You can call any of the specified methods on values in fields/variables of that type.
• When defining an interface class:• You should include headers of methods• You may include static final constants• You may not include fields, constructors, or method bodies.
© Peter Andreae
COMP 102 29:22
Interfaces: More examples
• We have used interfaces before!
public class Plotter implements UIButtonListener{
public Plotter(){
UI.addButton(“Read”, this);UI.addButton(“Plot” , this);UI.addButton(“Stats” , this);
}
ReadRead
PlotPlot
StatsStats
Button-7
name:
aListener:
:
“Read”Button-11
name:
aListener:
:
“Plot”Button-8
name:
aListener:
:
“Stats”
Plotter-54
numbers:
count:
public void actionPerformed(…
© Peter Andreae
COMP 102 29:23UIButtonListener is an Interface• UIButtonListener is an Interface class
• Every button object contains a field of type UIButtonListener
• UIButtonListener specifies one method:public interface UIButtonListener{ public void buttonPerformed(String button);}
• When a button is pressed.• the JVM looks for the object in the button’s buttonListener
field• It then calls the buttonPerformed method on the object
passing the name of the button.
It can only do this because the object is an UIButtonListener.(and this is almost the only thing it can do on the object)
© Peter Andreae
COMP 102 29:24
Interfaces: More examples
• The listener can be a Plotter, or aGenealogy, or a DiskGame … as long as it is also an UIButtonListener
DoBDoB
ParentsParents
ChildrenChildren
Button-18
name:
aListener:
:
“DoB”
Button-21
name:
aListener:
:
“Parents”
Button-5
name:
aListener:
:
“Children”
Genealogy-2
persons:
public void actionPerformed(…