43
Polymorphism Chapter 9 Instructor: Scott Kristjanson CMPT 125/125 SFU Burnaby, Fall 2013

wk07.3 - PolymorphismWk07.3 Slide 4 Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase 4 Scott Kristjanson – CMPT 125/126 – SFU Polymorphism Polymorphism literally

  • Upload
    others

  • View
    11

  • Download
    0

Embed Size (px)

Citation preview

Page 1: wk07.3 - PolymorphismWk07.3 Slide 4 Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase 4 Scott Kristjanson – CMPT 125/126 – SFU Polymorphism Polymorphism literally

Polymorphism Chapter 9

Instructor: Scott Kristjanson

CMPT 125/125

SFU Burnaby, Fall 2013

Page 2: wk07.3 - PolymorphismWk07.3 Slide 4 Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase 4 Scott Kristjanson – CMPT 125/126 – SFU Polymorphism Polymorphism literally

Wk07.3 Slide 2Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase

2

Scott Kristjanson – CMPT 125/126 – SFU

Scope

Polymorphism: The role of polymorphism Dynamic binding Using inheritance for polymorphism Exploring Java interfaces in more detail Using interfaces for polymorphism Polymorphic design

Page 3: wk07.3 - PolymorphismWk07.3 Slide 4 Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase 4 Scott Kristjanson – CMPT 125/126 – SFU Polymorphism Polymorphism literally

Wk07.3 Slide 3Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase

3

Scott Kristjanson – CMPT 125/126 – SFU

Method Binding

Consider the following method invocation:obj.MyMethod();

At some point, this invocation is bound to the definition of the method that it invokes

If this binding occurred at compile time, then that line of codewould call the same method every time

But Java defers method binding until run time; this is called dynamic binding or late binding

Page 4: wk07.3 - PolymorphismWk07.3 Slide 4 Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase 4 Scott Kristjanson – CMPT 125/126 – SFU Polymorphism Polymorphism literally

Wk07.3 Slide 4Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase

4

Scott Kristjanson – CMPT 125/126 – SFU

Polymorphism

Polymorphism literally means “having many forms”

A polymorphic reference is a variable that can refer to different types of objects at different points in time

The method invoked through a polymorphic reference can change from one invocation to the next

All object references in Java are potentially polymorphic

Page 5: wk07.3 - PolymorphismWk07.3 Slide 4 Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase 4 Scott Kristjanson – CMPT 125/126 – SFU Polymorphism Polymorphism literally

Wk07.3 Slide 5Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase

5

Scott Kristjanson – CMPT 125/126 – SFU

Polymorphism

Suppose we create the following reference variable

Occupation job;

Java allows this reference to point to an Occupation object, or to any object of any compatible type

This compatibility can be established using inheritance or usinginterfaces

Careful use of polymorphic references can lead to elegant, robust software designs

Poor use of polymorphic references can lead to overly complex designs with lots of hidden side-effects and surprises!

Page 6: wk07.3 - PolymorphismWk07.3 Slide 4 Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase 4 Scott Kristjanson – CMPT 125/126 – SFU Polymorphism Polymorphism literally

Wk07.3 Slide 6Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase

6

Scott Kristjanson – CMPT 125/126 – SFU

References and Inheritance

An object reference can refer to an object of its class, or to an object of any class related to it by inheritance

For example, if the Holiday class is the parent of Christmas, then a Holiday reference could be used to point to a Christmas object

Holiday special = new Christmas();

Page 7: wk07.3 - PolymorphismWk07.3 Slide 4 Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase 4 Scott Kristjanson – CMPT 125/126 – SFU Polymorphism Polymorphism literally

Wk07.3 Slide 7Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase

7

Scott Kristjanson – CMPT 125/126 – SFU

References and Inheritance

Assigning a child object to a parent reference is considered to be a widening conversion, and can be performed by simple assignment

Assigning an parent object to a child reference can be done also, but it is considered a narrowing conversion and must be done with a cast

The widening conversion is the most useful

Remember that Inheritance creates an Is-A relationship• While every Car is-a Vehicle, not all Vehicles is-a Car.• Assigning a parent object Vehicle to a child Car violates the Is-A relationship• Thus, this narrowing assignment seldom makes sense

Page 8: wk07.3 - PolymorphismWk07.3 Slide 4 Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase 4 Scott Kristjanson – CMPT 125/126 – SFU Polymorphism Polymorphism literally

Wk07.3 Slide 8Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase

8

Scott Kristjanson – CMPT 125/126 – SFU

Polymorphism via Inheritance

It is the type of the object being referenced, not the referencetype, that determines which method is invoked Suppose the Mammal class has a method called move, and the Horse class overrides itNow consider the following invocation

pet.move();

If pet refers to:• a Mammal object, this invokes the Mammal version of move• a Horse object, this invokes the Horse version of move

Page 9: wk07.3 - PolymorphismWk07.3 Slide 4 Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase 4 Scott Kristjanson – CMPT 125/126 – SFU Polymorphism Polymorphism literally

Wk07.3 Slide 9Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase

9

Scott Kristjanson – CMPT 125/126 – SFU

Let’s look at an example that pays a set of employees using a polymorphic method

Pay employees using a polymorphic method

Page 10: wk07.3 - PolymorphismWk07.3 Slide 4 Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase 4 Scott Kristjanson – CMPT 125/126 – SFU Polymorphism Polymorphism literally

Wk07.3 Slide 10Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase

10

Scott Kristjanson – CMPT 125/126 – SFU

//********************************************************************

// Firm.java Java Foundations

//

// Demonstrates polymorphism via inheritance.

//********************************************************************

public class Firm

{

//-----------------------------------------------------------------

// Creates a staff of employees for a firm

// and pays them.

//-----------------------------------------------------------------

public static void main(String[] args)

{

Staff personnel = new Staff();

personnel.payday();

}

}

Firm.main Creates New Staff and Pays Them

Page 11: wk07.3 - PolymorphismWk07.3 Slide 4 Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase 4 Scott Kristjanson – CMPT 125/126 – SFU Polymorphism Polymorphism literally

Wk07.3 Slide 11Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase

11

Scott Kristjanson – CMPT 125/126 – SFU

public class Staff

{ private StaffMember[] staffList;

// Constructor: Sets up the list of staff members.

public Staff()

{ staffList = new StaffMember[6];

staffList[0] = new Executive("Tony", "123 Main Line", "555-0469", "123-45-6789", 2423.07);

staffList[1] = new Employee ("Paulie", "456 Off Line", "555-0101", "987-65-4321", 1246.15);

staffList[2] = new Employee ("Vito", "789 Off Rocker", "555-0000", "010-20-3040", 1169.23);

staffList[3] = new Hourly ("Michael", "678 Fifth Ave.", "555-0690", "958-47-3625", 10.55 );

staffList[4] = new Volunteer("Adrianna", "987 Babe Blvd.", "555-8374");

staffList[5] = new Volunteer("Benny", "321 Dud Lane", "555-7282");

((Executive)staffList[0]).awardBonus(500.00);

((Hourly)staffList[3]).addHours(40); }

// Pays all staff members.

public void payday()

{ double amount;

for (int count=0; count < staffList.length; count++)

{ System.out.println (staffList[count]);

amount = staffList[count].pay(); // polymorphicif (amount == 0.0)

System.out.println("Thanks!");

else

System.out.println("Paid: " + amount);

System.out.println("-----------------------------------");

}

}

}

Staff Creates staffList and invokes pay method

Page 12: wk07.3 - PolymorphismWk07.3 Slide 4 Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase 4 Scott Kristjanson – CMPT 125/126 – SFU Polymorphism Polymorphism literally

Wk07.3 Slide 12Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase

12

Scott Kristjanson – CMPT 125/126 – SFU

abstract public class StaffMember{ protected String name;

protected String address;

protected String phone;

//-----------------------------------------------------------------

// Constructor: Sets up this staff member using the specified

// information.

//-----------------------------------------------------------------

public StaffMember(String eName, String eAddress, String ePhone)

{ name = eName;

address = eAddress;

phone = ePhone; }

//-----------------------------------------------------------------

// Returns a string including the basic employee information.

//-----------------------------------------------------------------

public String toString()

{ String result = "Name: " + name + "\n";

result += "Address: " + address + "\n";

result += "Phone: " + phone;

return result; }

//-----------------------------------------------------------------

// Derived classes must define the pay method for each type of

// employee.

//-----------------------------------------------------------------

public abstract double pay();}

StaffMember provides Abstract Method Pay()

Page 13: wk07.3 - PolymorphismWk07.3 Slide 4 Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase 4 Scott Kristjanson – CMPT 125/126 – SFU Polymorphism Polymorphism literally

Wk07.3 Slide 13Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase

13

Scott Kristjanson – CMPT 125/126 – SFU

//********************************************************************

// Volunteer.java Java Foundations

//

// Represents a staff member that works as a volunteer.

//********************************************************************

public class Volunteer extends StaffMember

{

//-----------------------------------------------------------------

// Constructor: Sets up this volunteer using the specified

// information.

//-----------------------------------------------------------------

public Volunteer(String eName, String eAddress, String ePhone)

{

super(eName, eAddress, ePhone);

}

//-----------------------------------------------------------------

// Returns a zero pay value for this volunteer.

//-----------------------------------------------------------------

public double pay()

{

return 0.0;

}}

Volunteer’s Pay()method always returns $0.00

Page 14: wk07.3 - PolymorphismWk07.3 Slide 4 Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase 4 Scott Kristjanson – CMPT 125/126 – SFU Polymorphism Polymorphism literally

Wk07.3 Slide 14Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase

14

Scott Kristjanson – CMPT 125/126 – SFU

public class Employee extends StaffMember{

protected String socialSecurityNumber;

protected double payRate;

//-----------------------------------------------------------------

// Constructor: Sets up this employee with the specified

// information.

//-----------------------------------------------------------------

public Employee(String eName, String eAddress, String ePhone,

String socSecNumber, double rate)

{ super(eName, eAddress, ePhone);

socialSecurityNumber = socSecNumber;

payRate = rate; }

//-----------------------------------------------------------------

// Returns information about an employee as a string.

//-----------------------------------------------------------------

public String toString()

{ String result = super.toString();

result += "\nSocial Security Number: " + socialSecurityNumber;

return result; }

//-----------------------------------------------------------------

// Returns the pay rate for this employee.

//-----------------------------------------------------------------

public double pay()

{ return payRate; }}

Employee’s Pay()method

Page 15: wk07.3 - PolymorphismWk07.3 Slide 4 Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase 4 Scott Kristjanson – CMPT 125/126 – SFU Polymorphism Polymorphism literally

Wk07.3 Slide 15Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase

15

Scott Kristjanson – CMPT 125/126 – SFU

public class Executive extends Employee

{

private double bonus;

//-----------------------------------------------------------------

// Constructor: Sets up this executive with the specified

// information.

//-----------------------------------------------------------------

public Executive(String eName, String eAddress, String ePhone,

String socSecNumber, double rate)

{

super(eName, eAddress, ePhone, socSecNumber, rate);

bonus = 0; // bonus has yet to be awarded

}

//-----------------------------------------------------------------

// Awards the specified bonus to this executive.

//-----------------------------------------------------------------

public void awardBonus(double execBonus)

{ bonus = execBonus; }

//-----------------------------------------------------------------

// Computes and returns the pay for an executive, which is the

// regular employee payment plus a one-time bonus.

//-----------------------------------------------------------------

public double pay()

{ double payment = super.pay() + bonus;

bonus = 0;

return payment;

}}

Executive’s Pay()method is Pay + Bonus

Page 16: wk07.3 - PolymorphismWk07.3 Slide 4 Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase 4 Scott Kristjanson – CMPT 125/126 – SFU Polymorphism Polymorphism literally

Wk07.3 Slide 16Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase

16

Scott Kristjanson – CMPT 125/126 – SFU

public class Hourly extends Employee

{ private int hoursWorked;

//-----------------------------------------------------------------

// Constructor: Sets up this hourly employee using the

// specified information.

//-----------------------------------------------------------------

public Hourly(String eName, String eAddress, String ePhone,

String socSecNumber, double rate)

{ super(eName, eAddress, ePhone, socSecNumber, rate);

hoursWorked = 0; }

//-----------------------------------------------------------------

// Adds the specified number of hours to this employee's

// accumulated hours.

//-----------------------------------------------------------------

public void addHours(int moreHours)

{ hoursWorked += moreHours; }

//-----------------------------------------------------------------

// Computes and returns the pay for this hourly employee.

//-----------------------------------------------------------------

public double pay()

{

double payment = payRate * hoursWorked;

hoursWorked = 0;

return payment;

}

Hourly employees Pay()

Page 17: wk07.3 - PolymorphismWk07.3 Slide 4 Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase 4 Scott Kristjanson – CMPT 125/126 – SFU Polymorphism Polymorphism literally

Wk07.3 Slide 17Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase

17

Scott Kristjanson – CMPT 125/126 – SFU

Pay is an abstract Polymorphic Method

Staff.Payday() invokes abstract method Pay() for each staff member:amount = staffList[i].pay();

Which Pay() method is invoked based on the class of each Array element:StaffMember staffList[i]

public class Hourly extends Employeepublic double pay(){

double payment = payRate * hoursWorked;hoursWorked = 0;return payment;

}

public class Volunteer extends StaffMemberpublic double pay(){

return 0.0;}

public class Executive extends Employeepublic double pay(){double payment = super.pay() + bonus;bonus = 0;return payment;}

Hourly

Employee

public class Employee extends StaffMemberpublic double pay(){ return payRate;

}

Volunteer

Executive

Page 18: wk07.3 - PolymorphismWk07.3 Slide 4 Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase 4 Scott Kristjanson – CMPT 125/126 – SFU Polymorphism Polymorphism literally

Wk07.3 Slide 18Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase

18

Scott Kristjanson – CMPT 125/126 – SFU

Interfaces

A Java interface is a collection of abstract methods and constantsAn abstract method is a method header without a method bodyAn abstract method can be declared using the modifier abstract, but because all methods in an interface are abstract, usually it is left offAn interface is used to establish a set of methods that a class will implement

Page 19: wk07.3 - PolymorphismWk07.3 Slide 4 Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase 4 Scott Kristjanson – CMPT 125/126 – SFU Polymorphism Polymorphism literally

Wk07.3 Slide 19Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase

19

Scott Kristjanson – CMPT 125/126 – SFU

Interfaces

public interface Doable{

public void doThis();public int doThat();public void doThis2(float value, char ch);public boolean doTheOther(int num);

}

interface is a reserved wordNone of the methods inan interface are given

a definition (body)

A semicolon immediatelyfollows each method header

Page 20: wk07.3 - PolymorphismWk07.3 Slide 4 Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase 4 Scott Kristjanson – CMPT 125/126 – SFU Polymorphism Polymorphism literally

Wk07.3 Slide 20Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase

20

Scott Kristjanson – CMPT 125/126 – SFU

Interfaces

An interface cannot be instantiatedMethods in an interface have public visibility by defaultA class formally implements an interface by

• stating so in the class header

• providing implementations for each abstract method in the interfaceIf a class states that it implements an interface, it must define all methods in the interface

Page 21: wk07.3 - PolymorphismWk07.3 Slide 4 Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase 4 Scott Kristjanson – CMPT 125/126 – SFU Polymorphism Polymorphism literally

Wk07.3 Slide 21Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase

21

Scott Kristjanson – CMPT 125/126 – SFU

public interface Doable{

public void doThis();public int doThat();etc.

}

Interfaces

public class CanDo implements Doable{

public void doThis (){

// whatever}

public void doThat (){

// whatever}

// etc.}

implements is areserved word

Each method listedin Doable is

given a definition

Page 22: wk07.3 - PolymorphismWk07.3 Slide 4 Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase 4 Scott Kristjanson – CMPT 125/126 – SFU Polymorphism Polymorphism literally

Wk07.3 Slide 22Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase

22

Scott Kristjanson – CMPT 125/126 – SFU

Interfaces

A class that implements an interface can implement other methods as well

In addition to (or instead of) abstract methods, an interface can contain constants

When a class implements an interface, it gains access to all itsconstants

Page 23: wk07.3 - PolymorphismWk07.3 Slide 4 Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase 4 Scott Kristjanson – CMPT 125/126 – SFU Polymorphism Polymorphism literally

Wk07.3 Slide 23Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase

23

Scott Kristjanson – CMPT 125/126 – SFU

Interfaces Enable true Encapsulation

Our class definitions, so far, include private data and methods

That’s how most programmers write their Classes

But that violates encapsulation because the programmer:• Views private definitions in your class while looking for public ones• Will see implementation details that should remain hidden

Java Interfaces provide true encapsulation by:• Presenting only the public information to the reader of the interface• All implementation details and private variables remain hidden• Can create a hierarchy of interfaces for different sets of users

Page 24: wk07.3 - PolymorphismWk07.3 Slide 4 Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase 4 Scott Kristjanson – CMPT 125/126 – SFU Polymorphism Polymorphism literally

Wk07.3 Slide 24Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase

24

Scott Kristjanson – CMPT 125/126 – SFU

//********************************************************************

// Encryptable.java Java Foundations

//

// Represents the interface for an object that can be encrypted

// and decrypted.

//********************************************************************

public interface Encryptable

{

public void encrypt();

public String decrypt();

}

Interface Example: Encryptable

Notice: Interfaces contains no private data or private methods

Page 25: wk07.3 - PolymorphismWk07.3 Slide 4 Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase 4 Scott Kristjanson – CMPT 125/126 – SFU Polymorphism Polymorphism literally

Wk07.3 Slide 25Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase

25

Scott Kristjanson – CMPT 125/126 – SFU

//********************************************************************

// Secret.java Java Foundations

//

// Represents a secret message that can be encrypted and decrypted.

//********************************************************************

import java.util.Random;

public class Secret implements Encryptable

{

private String message;

private boolean encrypted;

private int shift;

private Random generator;

//-----------------------------------------------------------------

// Constructor: Stores the original message and establishes

// a value for the encryption shift.

//-----------------------------------------------------------------

public Secret(String msg)

{

message = msg;

encrypted = false;

generator = new Random();

shift = generator.nextInt(10) + 5;

}

Secret implements Encryptable Interface

public interface Encryptable

{

public void encrypt();

public String decrypt();

}

Page 26: wk07.3 - PolymorphismWk07.3 Slide 4 Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase 4 Scott Kristjanson – CMPT 125/126 – SFU Polymorphism Polymorphism literally

Wk07.3 Slide 26Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase

26

Scott Kristjanson – CMPT 125/126 – SFU

//-----------------------------------------------------------------

// Encrypts this secret using a Caesar cipher. Has no effect if

// this secret is already encrypted.

//-----------------------------------------------------------------

public void encrypt(){

if (!encrypted)

{

String masked = "";

for (int index=0; index < message.length(); index++)

masked = masked + (char)(message.charAt(index)+shift);

message = masked;

encrypted = true;

}

}

//-----------------------------------------------------------------

// Decrypts and returns this secret. Has no effect if this

// secret is not currently encrypted.

//-----------------------------------------------------------------

public String decrypt(){

if (encrypted)

{

String unmasked = "";

for (int index=0; index < message.length(); index++)

unmasked = unmasked + (char)(message.charAt(index)-shift);

message = unmasked;

encrypted = false;

}

return message;

}

Secret implements Encryptable Interface

public interface Encryptable

{

public void encrypt();

public String decrypt();

}

Page 27: wk07.3 - PolymorphismWk07.3 Slide 4 Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase 4 Scott Kristjanson – CMPT 125/126 – SFU Polymorphism Polymorphism literally

Wk07.3 Slide 27Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase

27

Scott Kristjanson – CMPT 125/126 – SFU

//-----------------------------------------------------------------

// Returns true if this secret is currently encrypted.

//-----------------------------------------------------------------

public boolean isEncrypted()

{

return encrypted;

}

//-----------------------------------------------------------------

// Returns this secret (may be encrypted).

//-----------------------------------------------------------------

public String toString()

{

return message;

}

}

Secret can implement other APIs as well…

Page 28: wk07.3 - PolymorphismWk07.3 Slide 4 Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase 4 Scott Kristjanson – CMPT 125/126 – SFU Polymorphism Polymorphism literally

Wk07.3 Slide 28Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase

28

Scott Kristjanson – CMPT 125/126 – SFU

//********************************************************************

// SecretTest.java Java Foundations

//

// Demonstrates the use of a formal interface.

//********************************************************************

public class SecretTest

{

//-----------------------------------------------------------------

// Creates a Secret object and exercises its encryption.

//-----------------------------------------------------------------

public static void main(String[] args)

{

Secret hush = new Secret("Harry Potter is my hero!");

System.out.println(hush);

hush.encrypt();

System.out.println(hush);

hush.decrypt();

System.out.println(hush);

}

}

SecretTest – Encrypt/Decrypt a Message

Harry Potter is my hero!Pizz?(Xw||mz(q{(u?(pmzw)Harry Potter is my hero!

Page 29: wk07.3 - PolymorphismWk07.3 Slide 4 Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase 4 Scott Kristjanson – CMPT 125/126 – SFU Polymorphism Polymorphism literally

Wk07.3 Slide 29Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase

29

Scott Kristjanson – CMPT 125/126 – SFU

Interfaces

In UML, a dotted arrow is used to show that a class implements an interfaceThe designation <<interface>> is used to indicate an interface

Page 30: wk07.3 - PolymorphismWk07.3 Slide 4 Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase 4 Scott Kristjanson – CMPT 125/126 – SFU Polymorphism Polymorphism literally

Wk07.3 Slide 30Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase

30

Scott Kristjanson – CMPT 125/126 – SFU

Interfaces

A class can implement multiple interfaces

The interfaces are listed in the implements clause

The class must implement all methods in all interfaces listed inthe header

class ManyThings implements Interface1, Interface2

{

// all methods of both interfaces

}

Page 31: wk07.3 - PolymorphismWk07.3 Slide 4 Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase 4 Scott Kristjanson – CMPT 125/126 – SFU Polymorphism Polymorphism literally

Wk07.3 Slide 31Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase

31

Scott Kristjanson – CMPT 125/126 – SFU

Interfaces

The Java API contains many helpful interfaces

The Comparable interface contains one abstract method called compareTo, which is used to compare two objects

We discussed the compareTo method of the String class in Chapter 4

The String class implements Comparable, giving us the ability to put strings in lexicographic order

Page 32: wk07.3 - PolymorphismWk07.3 Slide 4 Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase 4 Scott Kristjanson – CMPT 125/126 – SFU Polymorphism Polymorphism literally

Wk07.3 Slide 32Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase

32

Scott Kristjanson – CMPT 125/126 – SFU

The Comparable Interface

Any class can implement Comparable to provide a mechanism for comparing objects of that type

if (obj1.compareTo(obj2) < 0)

System.out.println("obj1 is less than obj2");

• The value returned from compareTo should be negative is obj1 is less that obj2, 0 if they are equal, and positive if obj1 is greater than obj2

• When you design a class that implements the Comparable interface, it should follow this intent

Page 33: wk07.3 - PolymorphismWk07.3 Slide 4 Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase 4 Scott Kristjanson – CMPT 125/126 – SFU Polymorphism Polymorphism literally

Wk07.3 Slide 33Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase

33

Scott Kristjanson – CMPT 125/126 – SFU

The Comparable Interface

It’s up to the programmer to determine what makes one object less than another

For example, you may define the compareTo method of an Employee class to order employees by name (alphabetically) or by employee number

The implementation of the method can be as straightforward or as complex as needed for the situation

Page 34: wk07.3 - PolymorphismWk07.3 Slide 4 Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase 4 Scott Kristjanson – CMPT 125/126 – SFU Polymorphism Polymorphism literally

Wk07.3 Slide 34Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase

34

Scott Kristjanson – CMPT 125/126 – SFU

The Iterator Interface

As we discussed in Chapter 4, an iterator is an object that provides a means of processing a collection of objects one at a time

An iterator is created formally by implementing the Iteratorinterface, which contains three methods

The hasNext method returns a boolean result – true if there are items left to process

The next method returns the next object in the iteration

The remove method removes the object most recently returned by the next method

Page 35: wk07.3 - PolymorphismWk07.3 Slide 4 Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase 4 Scott Kristjanson – CMPT 125/126 – SFU Polymorphism Polymorphism literally

Wk07.3 Slide 35Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase

35

Scott Kristjanson – CMPT 125/126 – SFU

The Iterator Interface

By implementing the Iterator interface, a class formally establishes that objects of that type are iterators

The programmer must decide how best to implement the iterator functions

Once established, the for-each version of the for loop can be used to process the items in the iterator

Page 36: wk07.3 - PolymorphismWk07.3 Slide 4 Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase 4 Scott Kristjanson – CMPT 125/126 – SFU Polymorphism Polymorphism literally

Wk07.3 Slide 36Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase

36

Scott Kristjanson – CMPT 125/126 – SFU

Interfaces

You could write a class that implements certain methods (such as compareTo) without formally implementing the interface (Comparable)

However, formally establishing the relationship between a class and an interface allows Java to deal with an object in certain ways

Which brings us back to polymorphism

Page 37: wk07.3 - PolymorphismWk07.3 Slide 4 Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase 4 Scott Kristjanson – CMPT 125/126 – SFU Polymorphism Polymorphism literally

Wk07.3 Slide 37Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase

37

Scott Kristjanson – CMPT 125/126 – SFU

References and Interfaces

Suppose we have an interface called Speaker:public interface Speaker{

public void speak();public void announce(String str);

}

The interface name can now be used as the type of a reference variable:

Speaker current;

The variable current can now point to any object of any class that implements Speaker

Page 38: wk07.3 - PolymorphismWk07.3 Slide 4 Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase 4 Scott Kristjanson – CMPT 125/126 – SFU Polymorphism Polymorphism literally

Wk07.3 Slide 38Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase

38

Scott Kristjanson – CMPT 125/126 – SFU

Polymorphism via Interfaces

The version of speak that the following line invokes depends on the type of object that current is referencing:

current.speak();

This is analogous to the technique for polymorphism using inheritance

Page 39: wk07.3 - PolymorphismWk07.3 Slide 4 Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase 4 Scott Kristjanson – CMPT 125/126 – SFU Polymorphism Polymorphism literally

Wk07.3 Slide 39Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase

39

Scott Kristjanson – CMPT 125/126 – SFU

Polymorphism via Interfaces

Suppose two classes, Philosopher and Dog, both implement the Speaker interface, providing distinct versions of the speakmethod

In the following code, the first call to speak invokes one version and the second invokes another:

Speaker guest = new Philospher();

guest.speak();

guest = new Dog();

guest.speak();

Page 40: wk07.3 - PolymorphismWk07.3 Slide 4 Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase 4 Scott Kristjanson – CMPT 125/126 – SFU Polymorphism Polymorphism literally

Wk07.3 Slide 40Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase

40

Scott Kristjanson – CMPT 125/126 – SFU

Event Processing

Polymorphism plays an important role in the development of a Java graphical user interface (GUI)

As we will see later, we establish a relationship between a GUI component and a listener:

JButton button = new JButton();button.addActionListener(new MyListener());

Note that the addActionListener method is accepting a MyListener object as a parameter

We can pass any object that implements the ActionListenerinterface to the addActionListener method

Page 41: wk07.3 - PolymorphismWk07.3 Slide 4 Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase 4 Scott Kristjanson – CMPT 125/126 – SFU Polymorphism Polymorphism literally

Wk07.3 Slide 41Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase

41

Scott Kristjanson – CMPT 125/126 – SFU

Event Processing

The source code for the addActionListener method accepts a parameter of type ActionListener (the interface)

Because of polymorphism, any object that implements that interface is compatible with the parameter reference variable

The component can call the actionPerformed method because of the relationship between the listener class and the interface

Extending an adapter class to create a listener represents the same situation; the adapter class implements the appropriate interface already

Page 42: wk07.3 - PolymorphismWk07.3 Slide 4 Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase 4 Scott Kristjanson – CMPT 125/126 – SFU Polymorphism Polymorphism literally

Wk07.3 Slide 42Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase

42

Scott Kristjanson – CMPT 125/126 – SFU

Key Things to take away:

Polymorphism• The term polymorphism literally means “having many forms”• A polymorphic reference is a variable that can refer to different types of

objects at different points in time• The method invoked through a polymorphic reference can change from

one invocation to the next• It is the type of the object being referenced, not the reference type, that

determines which method is invoked• Interfaces allow true encapsulation and hide implementation details• Interfaces are critical for supporting GUIs and other functions cleanly

Page 43: wk07.3 - PolymorphismWk07.3 Slide 4 Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase 4 Scott Kristjanson – CMPT 125/126 – SFU Polymorphism Polymorphism literally

Wk07.3 Slide 43Slides based on Java Foundations 3rd Edition, Lewis/DePasquale/Chase

43

Scott Kristjanson – CMPT 125/126 – SFU

References:

1. J. Lewis, P. DePasquale, and J. Chase., Java Foundations: Introduction to Program Design & Data Structures. Addison-Wesley, Boston, Massachusetts, 3rd edition, 2014, ISBN 978-0-13-337046-1