Polymorphism and Interfaces

Similar documents
Chapter 12. Inheritance. Java Actually: A Comprehensive Primer in Programming

Program Control Flow

Program Control Flow

Object Communication

CS111: PROGRAMMING LANGUAGE II

More on Exception Handling

More on control structures

More on Exception Handling

Lecture Contents CS313D: ADVANCED PROGRAMMING LANGUAGE. What is Inheritance?

Sorting and searching arrays

CS313D: ADVANCED PROGRAMMING LANGUAGE

Inheritance and Polymorphism

Chapter 6. Arrays. Java Actually: A Comprehensive Primer in Programming

CS111: PROGRAMMING LANGUAGE II

Index. Index. More information. block statements 66 y 107 Boolean 107 break 55, 68 built-in types 107

Abstract Classes. Abstract Classes a and Interfaces. Class Shape Hierarchy. Problem AND Requirements. Abstract Classes.

BBM 102 Introduction to Programming II Spring Inheritance

How to define your own classes that implement abstractions. How to pass information to methods and how methods return values.

CS313D: ADVANCED PROGRAMMING LANGUAGE

Object Oriented Programming. Java-Lecture 11 Polymorphism

HAS-A Relationship. Association is a relationship where all objects have their own lifecycle and there is no owner.

Implementing Dynamic Data Structures

Graphical Interface and Application (I3305) Semester: 1 Academic Year: 2017/2018 Dr Antoun Yaacoub

Chapter 10 Classes Continued. Fundamentals of Java

HAS-A Relationship. Association is a relationship where all objects have their own lifecycle and there is no owner.

What is Inheritance?

Inheritance and Interfaces

Chapter 10. Exception Handling. Java Actually: A Comprehensive Primer in Programming

Java Object Oriented Design. CSC207 Fall 2014

Assoc. Prof. Marenglen Biba. (C) 2010 Pearson Education, Inc. All rights reserved.

IT101. Inheritance, Encapsulation, Polymorphism and Constructors

Practice for Chapter 11

A base class (superclass or parent class) defines some generic behavior. A derived class (subclass or child class) can extend the base class.

Java Magistère BFA

Day 4. COMP1006/1406 Summer M. Jason Hinek Carleton University

More On inheritance. What you can do in subclass regarding methods:

Name Return type Argument list. Then the new method is said to override the old one. So, what is the objective of subclass?

More on Inheritance. Interfaces & Abstract Classes

More Relationships Between Classes

CS111: PROGRAMMING LANGUAGE II

Contents. I. Classes, Superclasses, and Subclasses. Topic 04 - Inheritance

PROGRAMMING LANGUAGE 2

What are the characteristics of Object Oriented programming language?

HAS-A Relationship. If A uses B, then it is an aggregation, stating that B exists independently from A.

CLASS DESIGN. Objectives MODULE 4

Polymorphism 2/12/2018. Which statement is correct about overriding private methods in the super class?

CS-202 Introduction to Object Oriented Programming

First IS-A Relationship: Inheritance

CS111: PROGRAMMING LANGUAGE II

Type Hierarchy. Lecture 6: OOP, autumn 2003

Java How to Program, 8/e

Object Oriented Relationships

Accelerating Information Technology Innovation

Programming II (CS300)

Lecture 4: Extending Classes. Concept

Inheritance. Inheritance Reserved word protected Reserved word super Overriding methods Class Hierarchies Reading for this lecture: L&L

Basic Programming Elements

Relationships Between Real Things. CSE 143 Java. Common Relationship Patterns. Composition: "has a" CSE143 Sp Student.

Computer Science 2 Lecture 4 Inheritance: Trinidad Fruit Stand 02/15/2014 Revision : 1.7

Inheritance, Polymorphism, and Interfaces

Relationships Between Real Things CSC 143. Common Relationship Patterns. Composition: "has a" CSC Employee. Supervisor

Lecture 36: Cloning. Last time: Today: 1. Object 2. Polymorphism and abstract methods 3. Upcasting / downcasting

Inheritance. OOP: Inheritance 1

final Methods and Classes

Polymorphism. return a.doublevalue() + b.doublevalue();

CS/ENGRD 2110 SPRING Lecture 5: Local vars; Inside-out rule; constructors

Overview. Lecture 7: Inheritance and GUIs. Inheritance. Example 9/30/2008

Exercise: Singleton 1

More About Objects. Zheng-Liang Lu Java Programming 255 / 282

Exam Duration: 2hrs and 30min Software Design

CS313D: ADVANCED PROGRAMMING LANGUAGE

Classes and Inheritance Extending Classes, Chapter 5.2

Rules and syntax for inheritance. The boring stuff

AP COMPUTER SCIENCE JAVA CONCEPTS IV: RESERVED WORDS

Relationships Between Real Things CSE 143. Common Relationship Patterns. Employee. Supervisor

Computer Science II (20073) Week 1: Review and Inheritance

1.00 Lecture 13. Inheritance

Subclass Gist Example: Chess Super Keyword Shadowing Overriding Why? L10 - Polymorphism and Abstract Classes The Four Principles of Object Oriented

Inheritance. Unit 8. Summary. 8.1 Inheritance. 8.2 Inheritance: example. Inheritance Overriding of methods and polymorphism The class Object

Example: Count of Points

Software and Programming 1

Arrays Classes & Methods, Inheritance

Announcement. Agenda 7/31/2008. Polymorphism, Dynamic Binding and Interface. The class will continue on Tuesday, 12 th August

CH. 2 OBJECT-ORIENTED PROGRAMMING

Programming using C# LECTURE 07. Inheritance IS-A and HAS-A Relationships Overloading and Overriding Polymorphism

Topic 7: Inheritance. Reading: JBD Sections CMPS 12A Winter 2009 UCSC

Inheritance. Finally, the final keyword. A widely example using inheritance. OOP: Inheritance 1

Inheritance and object compatibility

Object Oriented Programming in Java. Jaanus Pöial, PhD Tallinn, Estonia

CIS 110: Introduction to computer programming

Inheritance. Transitivity

1- Differentiate between extends and implements keywords in java? 2- What is wrong with this code:

Object-Oriented Programming More Inheritance

Java Inheritance. Written by John Bell for CS 342, Spring Based on chapter 6 of Learning Java by Niemeyer & Leuck, and other sources.

Inheritance Motivation

Type Hierarchy. Comp-303 : Programming Techniques Lecture 9. Alexandre Denault Computer Science McGill University Winter 2004

Java Programming Lecture 7

Abstract class & Interface

Introduction to Object-Oriented Programming

Building custom components IAT351

Transcription:

Chapter 13 Polymorphism and Interfaces Lecture slides for: Java Actually: A Comprehensive Primer in Programming Khalid Azim Mughal, Torill Hamre, Rolf W. Rasmussen Cengage Learning, 2008. ISBN: 978-1-844480-933-2 http://www.ii.uib.no/~khalid/jac/ Permission is hereby granted to use these lecture slides in conjunction with the book. Modified: 2/2/10 Java Actually 13: Polymorphism and Interfaces 13-1/26

Topics Programming using inheritance: One superclass with several subclasses Polymorphism and dynamic method lookup Using polymorphic references Consequences of polymorphism Abstract classes: Instantiation and inheritance Method overriding Concrete classes Inheritance versus aggregation Substitution principle - Liskov Interfaces in Java Abstract methods Interface types Multiple inheritance for interfaces Interfaces and polymorphic references Super- and subinterfaces Java Actually 13: Polymorphism and Interfaces 13-2/26

Programming using inheritance A superclass often has multiple subclasses, which can declare new fields and hide inherited fields, and override instance methods to implement the abstraction of the subclass. EmployeeV0 firstname lastname hourlyrate NORMAL_WORKWEEK calculatesalary() printstate() calculateovertime() HourlyWorkerV0 calculatesalary() ManagerV0 managerbonus calculatesalary() printstate() PieceWorkerV0 numunits payperunit calculatesalary() printstate() Java Actually 13: Polymorphism and Interfaces 13-3/26

Polymorphic references Which object a reference denotes during program execution cannot always be determined during compilation.... EmployeeV0 employee; Scanner keyboard = new Scanner(System.in); System.out.println("Choose a category " + "(1=employee, 2=hourly worker, 3=manager, 4=piece worker):"); int selection = keyboard.nextint(); if (selection == 1) employee = new EmployeeV0("John", "Doe", 30.0); else if (selection == 2) employee = new HourlyWorkerV0("Mary", "Smith", 35.0); else if (selection == 3) employee = new ManagerV0("John D.", "Boss", 60.0, 105.0); else if (selection == 4) employee = new PieceWorkerV0("Ken", "Jones", 12.5, 75); else employee = new EmployeeV0("Ken", "Harris", 25.50); // Which object does the employee reference denote after the if statement?... The compiler cannot determine which object the reference employee will denote after the if statement above. A polymorphic reference is a reference that can refer to objects of different classes (types) at different times. A reference to a superclass is polymorphic since it can refer to objects of all subclasses of the superclass during program execution. Java Actually 13: Polymorphism and Interfaces 13-4/26

Dynamic method lookup When a method is called for an object, it is the class of the object (i.e. object type) and the method signature that determines which method definition is executed. The type of the reference (i.e. declared type) that denotes the object is not relevant.... // Which object does employee denote at the end of the if statement? System.out.println("Weekly salary=" + employee.calculatesalary()); // Which calculatesalary() method is executed? employee.printstate(); // and which printstate() method is executed here?... Dynamic method lookup is the process that determines which method definition a method signature denotes during execution, based on the class of the object. This process can lead to searching the inheritance hierarchy upwards to find the method definition. For the first call above, the calculatesalary() method in the class that the object employee refers to will be called. For the second call, the printstate() method in the EmployeeV0 class will be executed, if the object referred to employee belongs to the EmployeeV0 or HourlyWorkerV0 class. Otherwise, the printstate() method in one of the two other subclasses will be executed, dependent on whether employee denotes a manager or a piece worker. Java Actually 13: Polymorphism and Interfaces 13-5/26

Using polymorphic references class EmployeeArray { // From Program 13.4 static EmployeeV0[] emparray = { // (1) new EmployeeV0("John", "Doe", 30.0), new HourlyWorkerV0("Mary","Smith", 35.0), new PieceWorkerV0("Ken", "Jones", 12.5, 75), new ManagerV0("John D.", "Boss", 60.0, 105.0), ; static double[] emphours = { 37.5, 25.0, 30.0, 45.0 ; // (2) public static void main(string[] args) { // Traverses the employee array and prints selected properties for each // employee in the array. for (int i=0; i< emparray.length; i++){ System.out.printf("Employee no. %d: %s %s" + " has a weekly salary of %.2f GBP%n", i+1, emparray[i].firstname, // (3) emparray[i].lastname, // (4) emparray[i].calculatesalary(emphours[i])); // (5) Java Actually 13: Polymorphism and Interfaces 13-6/26

Program output: Employee no. 1: John Doe has a weekly salary of 1125,00 GBP Employee no. 2: Mary Smith has a weekly salary of 1312,50 GBP Employee no. 3: Ken Jones has a weekly salary of 937,50 GBP Employee no. 4: John D. Boss has a weekly salary of 3150,00 GBP Java Actually 13: Polymorphism and Interfaces 13-7/26

Consequences of polymorphism Polymorphism allows us to denote different types of objects with a common (polymorphic) reference, as long as these objects belongs to one of the subclasses or the superclass in an inheritance hierarchy. Dynamic method lookup causes the same call in the source code to result in different method implementations being executed during program execution. The actual type of the object decides which method is called. Clients can treat superclass and subclass objects in the same manner, and there is no need for changing the client even if new subclasses are added. This makes development and maintenance of clients easier. Java Actually 13: Polymorphism and Interfaces 13-8/26

Interfaces in Java An interface in Java defines a set of services - but without providing an implementation. The interface contains a set of abstract methods. A abstract method is comprised of the method name, parameter list and return type but no implementation. Example: interface ISportsClubMember { double calculatefee(); // abstract method Classes that want to implement an interface have to specify this using the keyword implements, for instance: class Student implements ISportsClubMember { double calculatefee() { return 100.0; //... other methods and fields and provide an implementation of the abstract methods in the interface. Java Actually 13: Polymorphism and Interfaces 13-9/26

Interfaces in Java (cont.) An interface is not a class - so we cannot create objects of an interface. However, an interface defines a type - an interface type - and we can declare references of this type, e.g. ISportsClubMember student; A reference of an interface type can denote objects of all classes that implements the interface: class EmployeeV1 implements ISportsClubMember {... double calculatefee() {...... ISportsClubMember member; member = new EmployeeV1("Al", "Hansen", 325.0);... member = new Student("Peter", "Jablonski", 35); With an interface type reference we can therefore get access to all services that the interface defines. Java Actually 13: Polymorphism and Interfaces 13-10/26

Interfaces in Java (cont.) An interface can also be used to import shared constants. class ImportantClass implements ImportantConstants { public int reply() { if (isdone()) return TERMINATE; // Interface name is not necessary due to implements. else return CONTINUE; boolean isdone() {... If the class ImportantClass had not declared that it implemented the interface ImportantConstants, it would have to use the dot notation, e.g. ImportantConstants.TERMINATE, to access the constants. Java Actually 13: Polymorphism and Interfaces 13-11/26

Interfaces in Java (cont.) A class can implement multiple Java interfaces. This is called multiple inheritance for interfaces. class ManagerV1 extends EmloyeeV1 implements ISportsClubMember, IRepresentative {... The class has to implement all abstract methods from every interface. A interface B can extend another interface A. Then the interface A is called a superinterface and B a subinterface. A class that implements B must implement the methods from both A and B. interface ITick { void tick(); interface ITickTock extends ITick { void tock(); class Watch implements ITickTock { void tick() {... // from ITick (superinterface) void tock() {... // from ITickTock (subinterface) Java Actually 13: Polymorphism and Interfaces 13-12/26

Inheritance hierarchy Object equals() tostring() getclass() Ding ding() Pling ding() dong() String length() substring() equals() Dong dong() class Dong extends Ding {... Plong class Plong extends Pling {... Java Actually 13: Polymorphism and Interfaces 13-13/26

Using interfaces to handle objects of multiple types Create a reference type that can denote things with both ding() and dong() methods. «interface» DingDong ding() dong() Object equals() tostring() notify() Ding ding() Pling ding() dong() String length() substring() equals() Dong dong() Plong A variable of type DingDong can refer to a Dong, a Pling and a Plong object, but not to a Ding object. Inheritance Interface Java Actually 13: Polymorphism and Interfaces 13-14/26

Using interfaces to handle objects of multiple types (cont.) interface DingDong { public void ding(); public void dong(); class Ding { public void ding() { System.out.println("ding from Ding"); class Dong extends Ding implements DingDong { public void dong() { System.out.println("dong from Dong"); class Pling implements DingDong{ public void dong() { System.out.println("dong from Pling"); public void ding() { System.out.println("ding from Pling"); class Plong extends Pling { public void plong() { System.out.println("plong fra Plong"); Java Actually 13: Polymorphism and Interfaces 13-15/26

public class TestInterface { public static void main(string[] args) { DingDong dingdongs[] = new DingDong[3]; // Create array of references dingdongs[0] = new Dong(); // Initialising references dingdongs[1] = new Pling(); dingdongs[2] = new Plong(); for (int i = 0; i < dingdongs.length; i++) dingdongs[i].ding(); // Polymorphic references + dynamic method lookup Program output: ding from Ding ding from Pling ding from Pling Java Actually 13: Polymorphism and Interfaces 13-16/26

Summing up the use of interfaces in Java A class must explicitly declare that it implements an interface (implements keyword). The class (or its subclasses) must implement methods for all abstract methods that are specified in the interface. If a class implements an interface, all of its subclasses also implement the interface automatically as a result of inheritance. Inheritance also applies for interfaces: super- and subinterfaces. Interfaces define a new reference type, and references of an interface type are polymorphic. A class can implement multiple interfaces. A class that implements a subinterface must also implement all methods from its superinterface. Two variants of inheritance: Design inheritance: Multiple interface inheritance where objects can belong to multiple types (using interfaces in Java). Implementation inheritance: Simple implementation inheritance where method and variable lookup is simpler (using subclasses in Java). Almost all advantages of general multiple inheritance without all implementation difficulties. Java Actually 13: Polymorphism and Interfaces 13-17/26

Abstract classes An abstract class is a class that cannot be instantiated. Abstract classes can be used as a superclass, which through inheritance enforces all subclasses to fulfill a common contract. An abstract class can implement parts of (or the whole) contract defined by a Java interface. A subclass of an abstract class must implement the abstract methods of the superclass, otherwise it should be declared abstract. Clients can use references of the abstract class to denote subclass objects, and by means of polymorphism the correct instance methods will be executed. Example: We want to offer discounted items. The class ItemWithDiscount is an abstract superclass for all discounted items. The classes Item and ItemWithUnitPrice are reused. Example: Use of the Template Method design pattern - an abstract class implements a common framework for behaviour; subclasses must implement the parts that are specific for them. Java Actually 13: Polymorphism and Interfaces 13-18/26

Abstract classes (cont.) Item itemname inventory getitemname() getinventory() setitemname() setinventory() tostring() ItemWithUnitPrice unitprice getunitprice() tostring() «abstract» ItemWithDiscount finddiscount() ItemWithFixedDiscount discount finddiscount() tostring() ItemWithPercentageDiscount finddiscount() tostring() Java Actually 13: Polymorphism and Interfaces 13-19/26

Abstract classes (cony.) public class Item { //... as before public class ItemWithUnitPrice extends Item { //... as before public abstract class ItemWithDiscount extends ItemWithUnitPrice { ItemWithDiscount(String itemname, int inventory, double price) { super(itemname, inventory, price); // calls the superclass constructor abstract double finddiscount(double pricewithoutdiscount, int numordered); public class ItemWithFixedDiscount extends ItemWithDiscount { private double discount; // fixed discount in GBP ItemWithFixedDiscount(String itemname, int inventory, double price, double discount) { super(itemname, inventory, price); // calling the superclass constructor assert discount >= 0.0: "Item discount must be greater than or equal to 0.0 GBP."; this.discount = discount; public double finddiscount(double pricewithoutdiscount, int numordered) { return discount; Java Actually 13: Polymorphism and Interfaces 13-20/26

public String tostring() { // overrides tostring() from the ItemWithUnitPrice class return super.tostring() + "\tdiscount: " + discount; public class ItemWithFixedDiscount extends ItemWithDiscount { private double discount; // fixed discount in GBP ItemWithFixedDiscount(String itemname, int inventory, double price, double discount) { super(itemname, inventory, price); // calling the superclass constructor assert discount >= 0.0: "Item discount must be greater than or equal to 0.0 GBP."; this.discount = discount; public double finddiscount(double pricewithoutdiscount, int numordered) { return discount; public String tostring() { // overrides tostring() from the ItemWithUnitPrice class return super.tostring() + "\tdiscount: " + discount; Java Actually 13: Polymorphism and Interfaces 13-21/26

public class ItemWithPercentageDiscount extends ItemWithDiscount { int discountinterval; // number of items that must be sold to get a discount double percentage; // percentage the discount is increased by for each interval double maxpercentage; // maximum percentage for discount ItemWithPercentageDiscount(String itemname, int inventory, double price, int discountinterval, double prosentsats, double maksimalsats) { super(itemname, inventory, price); // kaller superklassens konstruktør assert discountinterval > 0 : "Discount interval must be > 0"; assert percentage >= 0.0 : "Discount msut be >= 0% per interval"; assert maxpercentage >= 0.0 : "Maximum discount must be >= 0%"; this.discountinterval = discountinterval; this.percentage = percentage; this.maxpercentage = maxpercentage; public double finddiscount(double pricewithoutdiscount, int numordered) { int numintervals = numordered / discountinterval; double discount = numintervals * percentage; if (discount > maxpercentage) discount = maxpercentage; assert discount >= 0.0 : "Given discount must be >= 0%"; return discount/100.0*pricewithoutdiscount; public String tostring() { // overrides tostring() from the ItemwithUnitPrice class return super.tostring() + "\tdiscount interval: " + discountinterval + "\tpercentage: " + percentage + "\tmaximum percentage: " + maxpercentage; Java Actually 13: Polymorphism and Interfaces 13-22/26

public class Sales { public static void main(string[] args) { ItemWithUnitPrice[] stock = { new ItemWithUnitPrice("Coca cola 0.5l", 150, 3.50), new ItemWithFixedDiscount("Pepsi Max 0.5l", 100, 3.50, 0.50), new ItemWithUnitPrice("Pepsi Light 0.5l", 50, 3.00), new ItemWithFixedDiscount("Sparkling water 0.5l", 50, 2.00, 0.75), new ItemWithPercentageDiscount("Coca cola 0.33l", 500, 1.50, 10, 0.5, 10.0) ; int[] order = { 50, 50, 10, 20, 250 ; double total = 0; double discount = 0; double itemprice, itemdiscount; for (int i=0; i<stock.length; i++) { itemprice = stock[i].getunitprice(); itemdiscount = 0; if (stock[i] instanceof ItemWithDiscount) { ItemWithDiscount item = (ItemWithDiscount) stock[i]; itemdiscount = item.finddiscount(itemprice, order[i]); itemprice -= itemdiscount; itemdiscount *= order[i]; // for the whole order itemprice *= order[i]; // for the whole order System.out.println("Price for " + order[i] + " pieces of item '" + stock[i].getitemname() +"' is " + itemprice + " GBP."); Java Actually 13: Polymorphism and Interfaces 13-23/26

total += itemprice; discount += itemdiscount; System.out.println("Total amount: " + total+ " GBP."); System.out.println("Discount of: " + discount + " GBP has been subtracted."); Program output: Price for 50 pieces of item 'Coca cola 0.5l' is 175.0 GBP. Price for 50 pieces of item 'Pepsi Max 0.5l' is 150.0 GBP. Price for 10 pieces of item 'Pepsi Light 0.5l' is 30.0 GBP. Price for 20 pieces of item 'Sparkling water 0.5l' is 25.0 GBP. Price for 250 pieces of item 'Coca cola 0.33l' is 375.0 GBP. Total amount: 755.0 GBP. Discount of: 40.0 GBP has been subtracted. Java Actually 13: Polymorphism and Interfaces 13-24/26

Inheritance versus aggregation Inheritance offers reuse of classes by allowing new classes access to fields and methods from the superclass (and all other superclasses further up in the inheritance hierarchy). Aggregation offers reuse of classes by allowing new classes to declare composite objects where objects of existing classes are included as parts (a.k.a. constituent objects). Use inheritance when: the new class is a logical specialisation of an existing class. the existing class can be extended (i.e. is not a final class). Use aggregation when: the new class represents composite objects, and classes have already been declared for the part-objects. an existing class cannot be extended (i.e. is a final class). Note that aggregation if offered by default in Java, while for inheritance we need to use the keyword extends. Java Actually 13: Polymorphism and Interfaces 13-25/26

Substitution principle - Liskov A reference type can be: a class name an interface name an array type Subtypes and supertypes: In the inheritance hierarchy, a reference type can have one or more supertypes. The reference type is a subtype of each of its supertypes. Substitution principle: The behaviour of subtypes is in accordance with the specification of their supertypes, meaning that a subtype object can be substituted for a supertype object. Java Actually 13: Polymorphism and Interfaces 13-26/26