cs102 – oop_2
Post on 21-Jan-2016
58 Views
Preview:
DESCRIPTION
TRANSCRIPT
CS102 – OOP_2
Inheritance, Polymorphism, Interfaces & Abstract classes.
David Davenport
Abstract Classes & Methods
Motivation Do not want to include instances of
common (base) class in polymorphic collection
Want guarantee all objects in a polymorphic collection include certain methods
Get into Shapes… A collection of Rectangles & Circles?
CircleRectangle
TwoDShapeEnsure instances of TwoDShape cannot be added to collection
{Rectangle} {Circle} {Rectangle}
picture
{ ?? } { TwoDShape[] }
University People… Abstract vs. Concrete classes
Person
Student
GradUnderGrad
Staff
Academic Non-Academic
Secretarial Security Cleaning
Get into Shapes… Compute area of collection of shapes
Circle+getArea()
Rectangle +getArea()
Triangle
RightAngled Isosceles Equilateral
Polygon
TwoDShapeNeed guarantee that all future classes implement getArea()
Ensure instances of TwoDShape cannot be added to collection
+getArea()
Abstract Classes (& methods)
Abstract classes provide common parent which
cannot be instantiated a guarantee sub-classes already have
or must implement certain methods Create with keyword “abstract”
e.g. public abstract class Media {…}(sub-class extends abstract class as normal)
Can include Properties (& constructors!) Implemented methods Abstract methods
(create with keyword “abstract” & no body)e.g. public abstract double getDuration();
The MusicCD Collection
Object
MusicCD
DiscountCD
CDCollection
toString(), clone(), …
title, artist, price, tracks getTitle(),getArtist(),getPrice(),getDuration()
DiscountsetDiscount(-)getPrice()
Set of MusicCDgetValue()getTotalDuration()
The Media Hierarchy
Object
MusicCD
DiscountCD
Video
Media Library
DVD
price, title, getPrice(), getTitle(){abst} getDuration()
toString(), clone(), …
artist, tracksgetDuration()
discountsetDiscount(-)getPrice()
lengthdirectorgetDuration()
Set of MediagetValue()getTotalDuration()
The Media Classpublic abstract class Media {
String title; double price; public Media( String title, double price) { this.title = title; this.price = price; }
public String getTitle() { return title; }
public double getPrice() {return price; }
public void setPrice( double newPrice) { price = newPrice; }
public abstract int getDuration(); public String toString() { return title + "\t" + getPrice() + "\n"; }}
Declare as abstract- cannot be instantiated
Can include constants, properties constructors!, implemented & abstract methods
abstract method – look, no body!
Class must be abstract if it includes abstract methods
The Video Class// Video// David, 23/3/02
public class Video extends Media {
int length;String director;
public Video( String title, String director, int length, int price) {super( title, price);this.length = length;this.director = director;
}
public int getDuration() { return length; }
public String getDirector() { return director; }
public String toString() {return "VIDEO " + super.toString();
}}
Calls parent constructor
Sub-class simply extends “abstract” parent as normal
Implements required
“abstract” method
Overrides & reuses parent method
Interfaces
Motivation Provides a form of multiple-inheritance Guarantee specified methods exist Powerful design approach!
Interfaces An interface
is the boundary between two systemsthrough which they connect/communicate
Often standardised
SystemA
SystemB
Advantage:can change either side without affecting the other!
interface
Java Interfaces Declare with public interface X {…}
restricted to constants & abstract methods only cannot be instantiated guarantees any implementing class
has specified methods (else cannot be instantiated)
Classes extend one class & implement interfacese.g. public class U extends V implements X,Y,Z {…}
Can view as a special form of classso class U is_a V, is_a X, is_a Y, is_a Zi.e. a form of multiple inheritance
Simple example…
public interface Pointable {public boolean contains( int x, int y);
}
public class Circle extends TwoDShape implements Pointable {
int radius;
public Circle( int radius) {super();this.radius = radius;
}
public int getRadius() {return radius;
}
public boolean contains( int x, int y) {// set result true iff x,y inside circle...return result;
}}
Define interface with abstract method
Define classthat implements interface
Required method...won’t compile if omitted
Another example… Multiple inheritance?
Notebook is_a Computeris_a ElectricalDeviceis_a NetworkedDevice
ElectricCookeris_a Cookeris_a ElectricalDevice
Microwaveis_a Cookeris_a ElectricalDevice
SmartPhoneis_a Phoneis_a Computeris_a NetworkedDevice
Brain is_a Computeris_a BiologicalDevice
GasCookeris_a Cookeris_a GasDevice
One soln with interfaces
NotebookBrain
Computer ElectricalDevice
Microwave ElectricCooker GasCooker
Cooker
Another soln with interfaces
NotebookBrain
Computer ElectricalDevice
Microwave ElectricCooker GasCooker
Cooker
{V}
a
{V}
Interfaces… as a form of multiple-inheritance
{U}
{V}
{Y} {Z}
{X}
b
{X}
V a;a = new V();a = new U();
X b;b = new X();b = new U();
b = a;b = (U) a;
Y c;c = new U();
c = b;
public class U extends V implements X, Y, Z
c
{Y}
{U}
Categorised Library…
Object
MusicCD
DiscountCD
Video
Media Libraryprice, title, getPrice(){abst} getDuration()set & getCategory()
toString(), clone(), …
artist, tracksgetDuration()
discountsetDiscount(-)getPrice()
lengthdirectorgetDuration()
Set of MediagetValue()getTotalDuration()listInCategory(cat)
Simple: just add set/get category to base class…
The Categories Interface// Categories// David, 23/3/02
public interface Categories {
public final String COMEDY = "COMEDY";public final String ADVENTURE = "ADVENTURE";public final String CRIME = "CRIME";public final String NONFICTION = "NONFICTION";public final String ROCK = "ROCK";public final String POP = "POP";public final String CLASSICAL = "CLASSICAL";
public String getCategory();
public void setCategory( String c);}
Declare interface (instead of class)
Can only include
constants & abstract methods
Methods abstract by
default!
Media with Interface (1)
Object
MusicCD
DiscountCD
Video
Media Libraryprice, title, getPrice(){abst} getDuration()set & getCategory()
toString(), clone(), …
artist, tracksgetDuration()
discountsetDiscount(-)getPrice()
lengthdirectorgetDuration()
Set of MediagetValue()getTotalDuration()listInCategory(cat)
Categories
The Media Classpublic abstract class Media implements Categories {
// include all // properties, constructors & methods // as before..
// *********************************// & add properties & methods // to implement Categories interface
String category;
public String getCategory() {return category;
}
public void setCategory( String c) {category = c;
}// *********************************
}
Class implements one or more interfaces
by adding any necessary code
Media with Interface (2)
Object
MusicCD
DiscountCD
Video
Media Libraryprice, title, getPrice(){abst} getDuration()
toString(), clone(), …
artist, tracksgetDuration()setCategory() getCategory()
discountsetDiscount(-)getPrice()
lengthdirectorgetDuration()
Set of ?Categories?getValue()getTotalDuration()listInCategory(cat)
Categories
Categories
CatVideo setCategory() getCategory()
Media with Interface (3) Moral: Design interfaces first!
IMedia Media
ICategories
Library- initially: set of IMedia- later: set of ICategories
(a) (b)
Extending Interfaces (a)public interface IMedia {
public int getPrice();public int getDuration();
}
public interface ICategories extends IMedia {public String getCategory();public void setCategory( String c);
}
public class Library {ArrayList<IMedia>() items;public int getValue () {…}public int getTotalDuration() {…}
}
public class Library {ArrayList<ICategories>() items;public int getValue () {…}public int getTotalDuration() {…}public void listInCategory( cat) {…}
}
public abstract class Media implements IMedia {
public int getPrice() {…}}
public class Video extends Media {public int getDuration() {…}
}
public class CatVideo extends Videoimplements ICategories {
public String getCategory() {…}public void setCategory(
String c) {…}
}
Media with Interface (3) Moral: Design interfaces first!
ICategories
IMedia Media
Library- initially: set of IMedia- later: set of ICategories
IMedia ICategories
ICatMedia
Library- initially: set of IMedia- later: set of ICatMedia
(a) (b)
Extending Interfaces (b)public interface IMedia {
public int getPrice();public int getDuration();
}
public interface ICategories {public String getCategory();public void setCategory( String c);
}
public class Library {ArrayList<IMedia>() items;public int getValue () {…}public int getTotalDuration() {…}
}
public class Library {ArrayList<ICatMedia>() items;public int getValue () {…}public int getTotalDuration() {…}public void listInCategory( cat) {…}
}
public abstract class Media implements IMedia {
public int getPrice() {…}}
public class Video extends Media {public int getDuration() {…}
}
public class CatVideo extends Videoimplements ICatMedia {
public String getCategory() {…}public void setCategory(
String c) {…}
}
public interface ICatMedia extends IMedia, ICategories {
}
Interface notes Can’t create objects of interface type, only a
type that implements it Interfaces can extend interfaces
(but not classes) to form a hierarchy separate from class one
Start design with interfaces!
Java provides “instanceof” operator to test object type (but use very sparingly)
See also “getClass()”
Other notes… Method access modifiers
protected vs. default (nothing specified)
“default” is package access only
“protected” is package, plus can be sub-classed from another package!
top related