interfaces and polymorphism 9.1 using interfaces for code reuse 9.1.1 defining an interface 9.1.2...

62
Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse 9.1.1 Defining an Interface 9.1.2 implementing an interface 9.2 Converting between Class and Interface Types 9.3 Polymorphism 9.4 Callbacks 1

Upload: arlene-johnston

Post on 13-Jan-2016

226 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse 9.1.1 Defining an Interface 9.1.2 implementing an interface 9.2 Converting between Class

Interfaces and Polymorphism

9.1 Using Interfaces for Code Reuse9.1.1 Defining an Interface9.1.2 implementing an interface

9.2 Converting between Class and Interface Types9.3 Polymorphism9.4 Callbacks

1

Page 2: Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse 9.1.1 Defining an Interface 9.1.2 implementing an interface 9.2 Converting between Class

Assignment

Read Sections 9.1-9.3 and do self check exercises 1-7.

Read Section 9.4 and do self-check exercises 8-10.

Review Exercises: R9.1 – R9.4, R9.6, R9.8

Due – See Syllabus

Programming Exercises: P9.1, 9.2 & 9.4 (one prog) and 9.5 & 9.6 (one

prog) Due – See Syllabus 2

Page 3: Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse 9.1.1 Defining an Interface 9.1.2 implementing an interface 9.2 Converting between Class

Interface

A Java interface declares a set of methods and their signatures. Unlike a class, it provides no implementation.

To realize (implement) an interface, a class must supply all the methods that the interface requires.

3

Page 4: Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse 9.1.1 Defining an Interface 9.1.2 implementing an interface 9.2 Converting between Class

A Java interface declares methods that classes are expected to implement. It encapsulates a set of associated behaviors that can be used by classes that are not similar.

Contain no instance fields (cannot construct an object of an interface type)

Interfaces can be implemented by many classes

A class can implement multiple interfaces.4

Page 5: Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse 9.1.1 Defining an Interface 9.1.2 implementing an interface 9.2 Converting between Class

UML Diagram(Unified Modeling Language)

5

SkiJumper

Bird Airplane

<<interface>>Flier

fly()

A Flier is one that flies.

Three dissimilar classes

Page 6: Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse 9.1.1 Defining an Interface 9.1.2 implementing an interface 9.2 Converting between Class

Interface Example

public interface Flier{ void fly();}

6

Notice – no public modifier in the method header- Methods defined in an interface are all public by default.

Page 7: Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse 9.1.1 Defining an Interface 9.1.2 implementing an interface 9.2 Converting between Class

Classes realizing Flierpublic class Bird implements Flier

{ public void fly() { System.out.println("Using my wings to fly"); }}

==================================================================public class Airplane implements Flier

{ public void fly() { System.out.println("Using my jet engines to fly"); }}

==================================================================public class SkiJumper implements Flier, Athlete, Comparable

{ public void fly() { System.out.println("Using skis to take me into the air"); }}

7

Page 8: Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse 9.1.1 Defining an Interface 9.1.2 implementing an interface 9.2 Converting between Class

Creating an ArrayList of Fliers

ArrayList<Flier> airborne = new ArrayList<Flier>();

airborne.add(new SkiJumper(“Jumper”, “One”));

airborne.add(new SkiJumper(“Jumper”, “Two”));

airborne.add(new Airplane());

8

Page 9: Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse 9.1.1 Defining an Interface 9.1.2 implementing an interface 9.2 Converting between Class

UML Diagram

9

SkiJumper

Bird Airplane

<<interface>>Flier

fly()

<<interface>>

Athlete

train()

Page 10: Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse 9.1.1 Defining an Interface 9.1.2 implementing an interface 9.2 Converting between Class

Another Interface

public interface Athlete

{

void train(double hours);

}

10

Used by SkiJumper class

Page 11: Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse 9.1.1 Defining an Interface 9.1.2 implementing an interface 9.2 Converting between Class

Realizing the Interfaces

public class SkiJumper implements Flier, Athlete{

//Constructor{ }public void fly(){

System.out.println("Using skis to take " + myFirstname + " " + myLastName + " into the air.");

myNumberOfJumps++;}public void train(double hours){

System.out.println("I am on the slopes " + hours + " hours today.");myHoursTraining +=hours;

}

// more methods and private instance fields go here

11

Page 12: Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse 9.1.1 Defining an Interface 9.1.2 implementing an interface 9.2 Converting between Class

public interface Comparable

Method Summary  intcompareTo(Object o)

- Used with the String class

- Compares this object with the specified object for order (o). 

12

Returns:Neg value if String less than o0 if String equals oPos value if String greater than o

Page 13: Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse 9.1.1 Defining an Interface 9.1.2 implementing an interface 9.2 Converting between Class

Example

String implements Comparable We can compare two strings by invoking the String

method compareTo. String makes a promise to "define" what is means to

compare two String objects.

String s1 = <some string>;String s2 = <some string>;

if (s2.compareTo(s1))…….

13

Page 14: Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse 9.1.1 Defining an Interface 9.1.2 implementing an interface 9.2 Converting between Class

Examples

public class Circle implements Comparable

{ public int compareTo(Object o)

// Circle must define what it means to compare two Circle objects.

} If we want to compare two circles, we must

supply the method compareTo.

14

Page 15: Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse 9.1.1 Defining an Interface 9.1.2 implementing an interface 9.2 Converting between Class

Examples

public class Circle implements Comparable {

public int compareTo(Object o) { Circle c = (Circle) o; if (this.equals(c)) return 0; if (this.radius < c.radius) return -1; return 1;}

… // we have already defined equals for Circle. What if equals is not defined for Circle?

}

15

Page 16: Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse 9.1.1 Defining an Interface 9.1.2 implementing an interface 9.2 Converting between Class

Examples

public class Student implements Comparable {

public int compareTo(Object o) {

}

…}

16

Page 17: Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse 9.1.1 Defining an Interface 9.1.2 implementing an interface 9.2 Converting between Class

Examples

public class Student implements Comparable {

public int compareTo(Object o) { Student s = (Student) o; if (this.equals(s)) return 0; if (this.gpa < s.gpa) return -1; return 1;}

…}

17

Page 18: Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse 9.1.1 Defining an Interface 9.1.2 implementing an interface 9.2 Converting between Class

An interface…..

"To be useful, an interface must be realized (implemented) by at least one Java class." – Rick Mercer

A class may implement MANY interfaces.

18

Page 19: Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse 9.1.1 Defining an Interface 9.1.2 implementing an interface 9.2 Converting between Class

Interfaces

SHOULD NOT GROW! Classes have "contracts" with an interface.

If the interface changes, all classes that realize the interface are affected!

Interfaces allow for encapsulating similar behaviors between unrelated classes.

19

Page 20: Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse 9.1.1 Defining an Interface 9.1.2 implementing an interface 9.2 Converting between Class

Interface

All methods in an interface type are abstract, that is:

Contains constants, method signatures or both.

NO implementations.

No instance variables.

20

Page 21: Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse 9.1.1 Defining an Interface 9.1.2 implementing an interface 9.2 Converting between Class

Using interfaces

Define a set of methods as an interface. Classes that realize the interface must support

all the methods of the interface.

Create classes that implement those methods.

Compiler verifies that method calls are valid.

(if not, the compiler will complain)

21

Page 22: Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse 9.1.1 Defining an Interface 9.1.2 implementing an interface 9.2 Converting between Class

Interface declarations:

All methods in an interface are public. The methods in the interface are not declared as public because they are public by default.

When implementing the methods of the interface in a class, include the keyword public.

22

Page 23: Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse 9.1.1 Defining an Interface 9.1.2 implementing an interface 9.2 Converting between Class

Interfaces

Cannot be instantiated. Flier f = new Flier(); You can use interface name as a

variable type; variable can refer to an object of any class that implements the interface.

Flier b = new Bird(); Flier s = new SkiJumper();

23

NO

OK

OK

Page 24: Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse 9.1.1 Defining an Interface 9.1.2 implementing an interface 9.2 Converting between Class

Using interfaces

Interfaces define types (sets of methods).

A variable of type Flier must refer to an object that implements methods defined by Flier, not necessarily to an instance of Flier.

Actual method invoked is defined by the object’s class, at run-time. (dynamic or late binding)

24

Page 25: Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse 9.1.1 Defining an Interface 9.1.2 implementing an interface 9.2 Converting between Class

polymorphism…

Late Binding: Behavior can vary depending on the actual type of an object. Occurs at runtime. The method selection takes place when the program runs.

Early Binding (overloading):occurs at compile time. The compiler selects a method from several possible candidates.

25

Page 26: Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse 9.1.1 Defining an Interface 9.1.2 implementing an interface 9.2 Converting between Class

polymorphism

"In the object-oriented world, polymorphism refers to the ability of different kinds of objects to respond differently to the same commands, provided that the objects belong to classes with a common ancestor."

K.N.King

26

The principle that the actual type of the object determines the method to be called is called polymorphism.

The term “polymorphism” comes from the Greek words for “many shapes.”

Page 27: Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse 9.1.1 Defining an Interface 9.1.2 implementing an interface 9.2 Converting between Class

Again…

Early binding (overloading) of methods occurs if the compiler selects a method from several possible candidates as with overloaded methods.

Late binding occurs if the method selection takes place when the program runs.

27

Page 28: Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse 9.1.1 Defining an Interface 9.1.2 implementing an interface 9.2 Converting between Class

The importance of IS-A

You can convert from a class type to an interface type if the class realizes (implements) the interface.

String str = "word"; Comparable p = str; //

You need a cast to convert from an interface type to a class type.

String str = "word"; Comparable p = str; String t = p; //

28

NO

OK

Page 29: Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse 9.1.1 Defining an Interface 9.1.2 implementing an interface 9.2 Converting between Class

The importance of IS-A

You can convert from a class type to an interface type if the class realizes the interface.

String str = "word"; Comparable p = str; //

You need a cast to convert from an interface type to a class type.

String str = "word"; Comparable p = str; String t = (String)p; //

29

OK

OK

Page 30: Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse 9.1.1 Defining an Interface 9.1.2 implementing an interface 9.2 Converting between Class

instanceof operator

The instanceof operator tests whether an object belongs to a particular type. What happens here?

Flier aFlier = new SkiJumper("Joe","Smith"); Flier aFlier2 = new Airplane(); if (aFlier instanceof SkiJumper) System.out.println("That's right."); else System.out.println("NOT");

30

EXAMPLE 1

Page 31: Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse 9.1.1 Defining an Interface 9.1.2 implementing an interface 9.2 Converting between Class

instanceof operator

The instanceof operator tests whether an object belongs to a particular type. What happens here?

Flier aFlier = new SkiJumper("Joe","Smith"); Flier aFlier2 = new Airplane(); if (aFlier instanceof SkiJumper) System.out.println("That's right."); else System.out.println("NOT");

That's right.31

EXAMPLE 1

Page 32: Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse 9.1.1 Defining an Interface 9.1.2 implementing an interface 9.2 Converting between Class

instanceof operator

The instanceof operator tests whether an object belongs to a particular type. What happens here?

Flier aFlier = new SkiJumper("Joe","Smith"); Flier aFlier2 = new Airplane(); if (aFlier instanceof Flier) System.out.println("That's right."); else System.out.println("NOT");

32

EXAMPLE 2

Page 33: Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse 9.1.1 Defining an Interface 9.1.2 implementing an interface 9.2 Converting between Class

instanceof operator

The instanceof operator tests whether an object belongs to a particular type. What happens here?

Flier aFlier = new SkiJumper("Joe","Smith"); Flier aFlier2 = new Airplane(); if (aFlier instanceof Flier) System.out.println("That's right."); else System.out.println("NOT");

That's right. 33

EXAMPLE 2

Page 34: Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse 9.1.1 Defining an Interface 9.1.2 implementing an interface 9.2 Converting between Class

instanceof operator

The instanceof operator tests whether an object belongs to a particular type. What happens here?

Flier aFlier = new SkiJumper("Joe","Smith"); Flier aFlier2 = new Airplane(); if (aFlier2 instanceof Flier) System.out.println("That's right."); else System.out.println("NOT");

34

EXAMPLE 3

Page 35: Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse 9.1.1 Defining an Interface 9.1.2 implementing an interface 9.2 Converting between Class

instanceof operator

The instanceof operator tests whether an object belongs to a particular type. What happens here?

Flier aFlier = new SkiJumper("Joe","Smith"); Flier aFlier2 = new Airplane(); if (aFlier2 instanceof Flier) System.out.println("That's right."); else System.out.println("NOT");

That's right. 35

EXAMPLE 3

Page 36: Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse 9.1.1 Defining an Interface 9.1.2 implementing an interface 9.2 Converting between Class

instanceof operator

The instanceof operator tests whether an object belongs to a particular type. What happens?

Flier aFlier = new SkiJumper("Joe","Smith"); Flier aFlier2 = new Airplane(); if (aFlier2 instanceof SkiJumper) System.out.println("That's right."); else System.out.println("NOT");

36

EXAMPLE 4

Page 37: Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse 9.1.1 Defining an Interface 9.1.2 implementing an interface 9.2 Converting between Class

instanceof operator

The instanceof operator tests whether an object belongs to a particular type. What happens?

Flier aFlier = new SkiJumper("Joe","Smith"); Flier aFlier2 = new Airplane(); if (aFlier2 instanceof SkiJumper) System.out.println("That's right."); else System.out.println("NOT");

NOT 37

EXAMPLE 4

Page 38: Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse 9.1.1 Defining an Interface 9.1.2 implementing an interface 9.2 Converting between Class

Polymorphism is NOT Overloading.

Method signature refers to method name and parameters

Overloading means methods have different signatures(different parameters). Overloading usually occurs in same class. BankAccount has two constructors. One of

the constructors has one double parameter. One of the constructors has no parameters.

The compiler chooses the appropriate method.

38

Page 39: Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse 9.1.1 Defining an Interface 9.1.2 implementing an interface 9.2 Converting between Class

Polymorphism

The actual type of the object determines which method is to be called.

This is late binding (dynamic binding). The virtual machine, not the compiler, selects

the appropriate method at run time.

39

Page 40: Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse 9.1.1 Defining an Interface 9.1.2 implementing an interface 9.2 Converting between Class

Suppose C is a class that realizes the interfaces I and J. Which of the following assignments require a cast?

C c = …;I i = …;J j = …;

1. c = i;2. j = c;3. i = j;

40

Page 41: Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse 9.1.1 Defining an Interface 9.1.2 implementing an interface 9.2 Converting between Class

Suppose C is a class that realizes the interfaces I and J. Which of the following assignments require a cast?

C c = …;I I = …;J j = …;

1. c = i;2. j = c;3. i = j;

41

Page 42: Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse 9.1.1 Defining an Interface 9.1.2 implementing an interface 9.2 Converting between Class

Suppose C is a class that realizes the interfaces I and J. Which of the following assignments will throw an exception?

C c = new C();

1. I i = c;2. J j = (J)i;3. C d = (C)i;

42

Page 43: Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse 9.1.1 Defining an Interface 9.1.2 implementing an interface 9.2 Converting between Class

Suppose C is a class that realizes the interfaces I and J. Which of the following assignments will throw an exception?

C c = new C();

1. I i = c;2. J j = (J)i;3. C d = (C)i;

NONE

43

Page 44: Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse 9.1.1 Defining an Interface 9.1.2 implementing an interface 9.2 Converting between Class

Consider the following DataSet class.p. 249

//Computes the average of a set of// data values.

public class DataSet{ public DataSet() { sum = 0; count = 0; maximum = 0; }

//Adds a data value to the data // set

public void add(double x) { sum = sum + x; if (count == 0 || maximum < x)

maximum = x;

count++; }

//Returns the average of the added data. public double getAverage() { if (count == 0) return 0; else return sum / count; }//Returns the largest of the added data// or 0 if no data has been addedpublic double getMaximum() { return maximum; }

private double sum; private double maximum; private int count;}

44

Page 45: Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse 9.1.1 Defining an Interface 9.1.2 implementing an interface 9.2 Converting between Class

Concerns

Suppose we wanted to find the BankAccount with the highest balance?

Suppose we wanted to find the Coin with the highest value?

Suppose we wanted to find the Student with the highest gpa?

45

Page 46: Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse 9.1.1 Defining an Interface 9.1.2 implementing an interface 9.2 Converting between Class

Solution://Computes the average of a set of// data values.

public class DataSet{ public DataSet() { sum = 0; count = 0; maximum = 0; }

//Adds a data value to the data // set

public void add(BankAccount x) { sum = sum + x.getBalance(); if (count == 0 || maximum.getBalance() <

x.getBalance())

maximum = x; count++; }

//Returns the average of the added data.public double getAverage() { if (count == 0) return 0; else return sum / count; }//Returns the largest of the added data// or 0 if no data has been addedpublic BankAccount getMaximum() { return maximum; }

private double sum; private BankAccount maximum; private int count;}

46

BankAccount solution

Page 47: Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse 9.1.1 Defining an Interface 9.1.2 implementing an interface 9.2 Converting between Class

Solution://Computes the average of a set of// data values.

public class DataSet{ public DataSet() { sum = 0; count = 0; maximum = 0; }

//Adds a data value to the data // set

public void add(Coin x) { sum = sum + x.getValue(); if (count == 0 || maximum.getValue () <

x.getValue ())

maximum = x; count++; }

//Returns the average of the added data.public double getAverage() { if (count == 0) return 0; else return sum / count; }//Returns the largest of the added data// or 0 if no data has been addedpublic Coin getMaximum() { return maximum; }

private double sum; private Coin maximum; private int count;}

47

Coin solution

Page 48: Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse 9.1.1 Defining an Interface 9.1.2 implementing an interface 9.2 Converting between Class

Solution://Computes the average of a set of// data values.

public class DataSet{ public DataSet() { sum = 0; count = 0; maximum = 0; }

//Adds a data value to the data // set

public void add(Student x) { sum = sum + x.getGpa(); if (count == 0 || maximum.getGpa () <

x.getGpa ())

maximum = x; count++; }

//Returns the average of the added data.public double getAverage() { if (count == 0) return 0; else return sum / count; }//Returns the largest of the added data// or 0 if no data has been addedpublic Student getMaximum() { return maximum; }

private double sum; private Student maximum; private int count;}

48

Student solution

Page 49: Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse 9.1.1 Defining an Interface 9.1.2 implementing an interface 9.2 Converting between Class

Hmmmmm…

Clearly the mechanics of analyzing the data is the same in ALL cases but the details of measurement are different. BankAccount : balance Coin: value Student: gpa

49

Page 50: Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse 9.1.1 Defining an Interface 9.1.2 implementing an interface 9.2 Converting between Class

Suppose we consider the following:

public interface Measurable{

double getMeasure();

}

50

Page 51: Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse 9.1.1 Defining an Interface 9.1.2 implementing an interface 9.2 Converting between Class

Solution://Computes the average of a set of// data values.

public class DataSet{ public DataSet() { sum = 0; count = 0; maximum = null; }

//Adds a data value to the data // set

public void add(Measurable x) { sum = sum + x.getMeasure(); if (count == 0 || maximum.getMeasure () <

x.getMeasure ()) maximum = x;

count++; }

//Returns the average of the added data.public double getAverage() { if (count == 0) return 0; else return sum / count; }//Returns the largest of the added data// or 0 if no data has been addedpublic Measurable getMaximum() { return maximum; }

private double sum; private Measurable maximum; private int count;}

51

Page 52: Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse 9.1.1 Defining an Interface 9.1.2 implementing an interface 9.2 Converting between Class

And…

public class BankAccount implements Measurable{. . . . .

public double getMeasure(){

return balance; }

52

Page 53: Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse 9.1.1 Defining an Interface 9.1.2 implementing an interface 9.2 Converting between Class

Test classpublic class DataSetTest{public static void main(String[]

args) { DataSet bankData = new DataSet();

bankData.add(new BankAccount(0)); bankData.add(new

BankAccount(10000)); bankData.add(new

BankAccount(2000));

System.out.println("Average balance = " + bankData.getAverage());

Measurable max = bankData.getMaximum();

System.out.println("Highest balance = " +

max.getMeasure());

DataSet coinData = new DataSet();

coinData.add(new Coin(0.25, "quarter"));

coinData.add(new Coin(0.1, "dime"));coinData.add(new Coin(0.05,

"nickel"));

System.out.println("Average coin value = " + coinData.getAverage());

max = coinData.getMaximum();String name = ((Coin)max).getName();

System.out.println(name + " has the highest coin value of " + max.getMeasure());

}}

53

Page 54: Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse 9.1.1 Defining an Interface 9.1.2 implementing an interface 9.2 Converting between Class

And…

public class Coin implements Measurable{. . . . .

public double getMeasure(){

return value; }

54

Page 55: Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse 9.1.1 Defining an Interface 9.1.2 implementing an interface 9.2 Converting between Class

And…

public class Student implements Measurable{. . . . .

public double getMeasure(){

return gpa; }

55

Page 56: Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse 9.1.1 Defining an Interface 9.1.2 implementing an interface 9.2 Converting between Class

Using Interfaces for Callbacks

Using interfaces for callbacks describes a method for improving code reusability.

Limitations of Measurable interface: • You can add Measurable interface only to classes under

your control • You can measure an object in only one way

E.g., cannot analyze a set of savings accounts by both bank balance and interest rate

• Callback mechanism: allows a class to call back a specific method when it needs more information

• In previous DataSet implementation, responsibility of measuring lies with the added objects themselves

56

Page 57: Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse 9.1.1 Defining an Interface 9.1.2 implementing an interface 9.2 Converting between Class

Using Interfaces for Callbacks (cont.)

Alternative: Hand the object to be measured to a method: public interface Measurer { double measure(Object anObject); }

Object is the "lowest common denominator" of all classes (classes create objects)

57

Page 58: Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse 9.1.1 Defining an Interface 9.1.2 implementing an interface 9.2 Converting between Class

Using Interfaces for Callbacks

add method asks measurer (and not the added object) to do the measuring:

(here measurer is an object of type Measurer)

public void add(Object x) { sum = sum + measurer.measure(x); if (count == 0 || measurer.measure(maximum) < measurer.measure(x)) maximum = x; count++;

58

Page 59: Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse 9.1.1 Defining an Interface 9.1.2 implementing an interface 9.2 Converting between Class

Using Interfaces for Callbacks

You can define measurers to take on any kind of measurement public class RectangleMeasurer implements Measurer { public double measure(Object anObject) { Rectangle aRectangle = (Rectangle) anObject; double area = aRectangle.getWidth() * aRectangle.getHeight();

return area; } } Must cast from Object to Rectangle

Rectangle aRectangle = (Rectangle) anObject; The RectangleMeasurer class is a helper method – its one

purpose is to tell the DataSet how to measure its objects.

59

Page 60: Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse 9.1.1 Defining an Interface 9.1.2 implementing an interface 9.2 Converting between Class

Using Interfaces for Callbacks (cont.)

Pass measurer to data set constructor:

Measurer m = new RectangleMeasurer(); DataSet data = new DataSet(m); data.add(new Rectangle(5, 10, 20, 30)); data.add(new Rectangle(10, 20, 30, 40)); . . .

SEE TEXT PAGE 400-402 for example of this set.

60

Page 61: Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse 9.1.1 Defining an Interface 9.1.2 implementing an interface 9.2 Converting between Class

Note that the Rectangle class is decoupled from the Measurer interface

UML Diagram of Measurer Interface and Related Classes

Page 62: Interfaces and Polymorphism 9.1 Using Interfaces for Code Reuse 9.1.1 Defining an Interface 9.1.2 implementing an interface 9.2 Converting between Class

Assignment

Read Sections 9.1-9.3 and do self check exercises 1-7. Read Section 9.4 and do self-check exercises 8-10. Review Exercises:

R9.1 – R9.4, R9.6, R9.8 All Due - See Syllabus

Programming Exercises: P9.1 P9.2 and 9.4 (code as one program) P9.5 and 9.6 (code as one program)

All Due - See Syllabus

62