1 / 34

Chapter 11 – Interfaces and Polymorphism

Chapter 11 – Interfaces and Polymorphism. Chapter Goals. Learn about interfaces Convert between class and interface references Understand the concept of polymorphism Understand the purpose of interfaces to decouple classes. Interfaces and Polymorphism.

pcrawford
Download Presentation

Chapter 11 – Interfaces and Polymorphism

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Chapter 11 – Interfaces and Polymorphism

  2. Chapter Goals • Learn about interfaces • Convert between class and interface references • Understand the concept of polymorphism • Understand the purpose of interfaces to decouple classes

  3. Interfaces and Polymorphism • Interfaces are important for developing reusable software components • Polymorphism is the principal at the heart of this process – a key component of object oriented programming

  4. Concept #1: Interfaces • Real world – surface between two adjacent entities, spheres, etc. • CS world – the surface of a class • How will code behave (what methods will it define) • Ex. Javadocs are an interface to the underlying class – defines how the class behaves

  5. Using Interfaces for Code Reuse • Use interface types to make code more general • Identify common/essential operations • Let’s say there is a class DataSet that keeps track of a running total of real numbers

  6. public class DataSet{ private double sum; private double maximum; private int count; 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++; }

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

  8. Example • Problem: Only works for numbers • What if we wanted to keep track of BankAccounts?

  9. public class DataSet{ . . . public void add(BankAccount x) { sum = sum + x.getBalance(); if (count == 0 || maximum.getBalance() < x.getBalance()) maximum = x; count++; } public BankAccount getMaximum(){ return maximum; } private double sum; private BankAccount maximum; private int count; }

  10. Example • What if we want to do the same for Coins?

  11. public class DataSet{ . . . public void add(Coin x) { sum = sum + x.getValue(); if (count == 0 || maximum.Value() < x.getValue()) maximum = x; count++; } public Coin getMaximum(){ return maximum; } private double sum; private Coin maximum; private int count; }

  12. Interfaces • The mechanics of analyzing the data is the same in all cases; details of measurement differ • We have three classes doing three very similar tasks, but they all contain redundant code • Classes could agree on a method getMeasure() that obtains the measure to be used in the analysis

  13. Interfaces • We can then implement a single reusable DataSet class whose add method looks like this: sum = sum + x.getMeasure(); if (count == 0 || maximum.getMeasure() < x.getMeasure()) { maximum = x; count++; }

  14. Interfaces • What type is x? • We want x to be an type of object that has a getMeasure() method • Interfaces allow us to ensure that this is the case

  15. Interfaces • An interface type is used to specify required operations for a class public interface Measurable { double getMeasure(); }

  16. Interfaces • Java uses interfaces to define a common set of behaviors that varying objects can share • Define an interface that only specifies methods that must be used (not how to use them) • Create a class that implements this interface – it is signing a contract that it will define all of the methods the interface specifies • This contract insures that we can make assumptions about what methods are available (without looking at a javadoc)

  17. Interfaces • An interface is much like a class in terms of how it is defined except it is • Not instantiable • Has no instance fields • Has no body to the methods, only signatures - Abstract methods only • The methods are automatically public

  18. Static constant fields • Interfaces can have class constant fields • Omit public static final – automatically makes fields this way public interface SwingConstants { int NORTH = 1; int NORTHEAST = 2; int EAST = 3; … }

  19. Example public interface KeyListener { public void keyHit(char c); } • Anything that implements this interface must define a method keyHit() to handle keyboard entry • Interfaces only define the minimum methods, you can have as many others as you want

  20. public class DataSet{ . . . public void add(Measureable x) { sum = sum + x.getMeasure(); if (count == 0 || maximum.getMeasure() < x.getMeasure()) maximum = x; count++; } public Measureable getMaximum(){ return maximum; } private double sum; private Measureable maximum; private int count; }

  21. Interfaces • Now DataSet can be used for any class that implements the Measurable interface • To implement an interface, use implements reserved word and implement all methods specified in the interface

  22. Implements public class ClassName implements Measurable { public double getMeasure() { Implementation } // Additional methods and fields }

  23. Defining interfaces public interface InterfaceName { // method signatures }

  24. Implementing interfaces public class ClassName implements InterfaceName, InterfaceName, ... { // methods // instance variables } • Note: Can implement multiple interfaces

  25. Example public class BankAccount implements Measurable { public double getMeasure() { return balance; } // Additional methods and fields }

  26. Converting Between Classes and Interfaces • You can convert from a class type to an interface type, provided the class implements the interface BankAccount account = new BankAccount(10000); Measurable x = account; // OK Coin dime = new Coin(0.1, "dime"); Measurable x = dime; // Also OK

  27. Converting • Cannot convert between unrelated typesMeasurable x = new Rectangle(5, 10, 20, 30); // ERROR • Because Rectangle doesn't implement Measurable • Follow IS-A model – BankAccount IS-A Measurable

  28. Converting • Reverse is not necessarily true – compiler doesn’t know if Measurable IS-A Coin • How did we deal with this before?

  29. Type Casting • Add coin objects to DataSetDataSet coinData = new DataSet();coinData.add(new Coin(0.25, "quarter"));coinData.add(new Coin(0.1, "dime"));. . .Measurable max = coinData.getMaximum(); • What can you do with it? It's not of type CoinString name = max.getName(); // ERROR

  30. Type Casting • You need a cast to convert from an interface type to a class type • You know it's a coin, but the compiler doesn't. Apply a cast: Coin maxCoin = (Coin) max;String name = maxCoin.getName();

  31. Type Casting • If you are wrong and max isn't a coin, the compiler throws an exception • Difference with casting numbers: • When casting number types you agree to the information loss • When casting object types you agree to that risk of causing an exception

  32. Polymorphism • An interface variable holds a reference to an object of a class that implements the interfaceMeasurable x;x = new BankAccount(10000);x = new Coin(0.1, "dime"); • Note that the object to which x refers doesn't have type Measurable; • the type of the object is some class that implements the Measurable interface

  33. Purpose of Polymorphism • You can call any of the interface methods:double m = x.getMeasure(); • Which method is called? • Depends on the actual object.  • If x refers to a bank account, calls BankAccount.getMeasure • If x refers to a coin, calls Coin.getMeasure

  34. Polymorphism • Polymorphism (many shapes): Behavior can vary depending on the actual type of an object • The property that we can call x.getMeasure() with multiple contexts is an instance of polymorphism • This is also called late binding as the method that is called is resolved at runtime • Different from overloading; overloading is resolved by the compiler (early binding)

More Related