recitation 4 abstract classes, interfaces. a little more geometry! abstract classes shape x ____ y...

25
Recitation 4 Abstract classes, Interfaces

Upload: cory-small

Post on 01-Jan-2016

217 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Recitation 4 Abstract classes, Interfaces. A Little More Geometry! Abstract Classes Shape x ____ y ____ Triangle area() base____ height ____ Circle area()

Recitation 4

Abstract classes, Interfaces

Eric Chahin
Not really sure if we need to spend time on an exercise that forces them to write the bad code. Could we make this a demo instead and get rid of the notes and assumptions below?
Eric Chahin
Do we need to display this text on the screen? It's fairly small, and I'm not sure if displaying getters and setters helps them. Could you use a class diagram instead and just put the area formulas in the boxes?
Eric Chahin
Actually, I think I spoke too soon. I think saying these things are okay in the notes section. I'm not sure if we need a slide on this.We could probably just convince them that the casting is way too ugly and not readable.
Eric Chahin
I actually think Gries's way of motivating Abstract classes is better, where he has a super class with a method that doesn't make any semantic sense.
Eric Chahin
I like this slide overall but you should probably move the issues section to the Notes section
Eric Chahin
Most likely should squash this slide down to the previous one and remove some text. Fewer slides the better.
Eric Chahin
Define this better
Page 2: Recitation 4 Abstract classes, Interfaces. A Little More Geometry! Abstract Classes Shape x ____ y ____ Triangle area() base____ height ____ Circle area()

A Little More Geometry!

Abstract Classes

Shape x ____ y ____

Triangle area() base____ height ____

Circle area() radius __5__

Square area() size ____

Page 3: Recitation 4 Abstract classes, Interfaces. A Little More Geometry! Abstract Classes Shape x ____ y ____ Triangle area() base____ height ____ Circle area()

Demo 1: Complete this function

/** Return the sum of the areas of * the shapes in s */static double sumAreas(Shape[] s) { }

1. Operator instanceof and casting are required2. Adding new Shape subclasses breaks sumAreas

Abstract Classes

Page 4: Recitation 4 Abstract classes, Interfaces. A Little More Geometry! Abstract Classes Shape x ____ y ____ Triangle area() base____ height ____ Circle area()

A Partial Solution:

Add method area to class Shape:

Abstract Classes

public double area() {return 0;

}

public double area() {throw new RuntimeException(“area not

overridden”);}

Page 5: Recitation 4 Abstract classes, Interfaces. A Little More Geometry! Abstract Classes Shape x ____ y ____ Triangle area() base____ height ____ Circle area()

Problems not solved

1. What is a Shape that isn’t a Circle, Square, Triangle, etc? What is only a shape, nothing more specific?a.Shape s= new Shape(...); Should be

disallowed

Abstract Classes

2. What if a subclass doesn’t override area()?a. Can’t force the subclass to override it!b. Incorrect value returned or exception thrown.

Page 6: Recitation 4 Abstract classes, Interfaces. A Little More Geometry! Abstract Classes Shape x ____ y ____ Triangle area() base____ height ____ Circle area()

Solution: Abstract classes

public abstract class Shape {

public double area() {return 0;

}}

Abstract Classes

Abstract classMeans that it can’t be instantiated. new Shape() illegal

Page 7: Recitation 4 Abstract classes, Interfaces. A Little More Geometry! Abstract Classes Shape x ____ y ____ Triangle area() base____ height ____ Circle area()

Solution: Abstract methods

public abstract class Shape {

public abstract double area();

}

Abstract Classes

Abstract methodSubclass must override.

● Can also have implemented methods

● Place abstract method only in abstract class.

● Semicolon instead of body.

Page 8: Recitation 4 Abstract classes, Interfaces. A Little More Geometry! Abstract Classes Shape x ____ y ____ Triangle area() base____ height ____ Circle area()

Demo 2: A better solution

We modify class Shape to be abstract and make area() an abstract method.

● Abstract class prevents instantiation of class Shape● Abstract method forces all subclasses to override area()

Abstract Classes

Page 9: Recitation 4 Abstract classes, Interfaces. A Little More Geometry! Abstract Classes Shape x ____ y ____ Triangle area() base____ height ____ Circle area()

Abstract Classes, Abstract Methods

1. Cannot instantiate an object of an abstract class. (Cannot use new-expression)

2. A subclass must override abstract methods.

Abstract Classes

Page 10: Recitation 4 Abstract classes, Interfaces. A Little More Geometry! Abstract Classes Shape x ____ y ____ Triangle area() base____ height ____ Circle area()

Interfaces

Page 11: Recitation 4 Abstract classes, Interfaces. A Little More Geometry! Abstract Classes Shape x ____ y ____ Triangle area() base____ height ____ Circle area()

Problem

Mammal

Human ParrotDog

Whistler

Interfaces

Bird

AnimalWhere is the best place to implement whistle()?

Page 12: Recitation 4 Abstract classes, Interfaces. A Little More Geometry! Abstract Classes Shape x ____ y ____ Triangle area() base____ height ____ Circle area()

No multiple inheritance in Java!

class Whistler {void breathe() { … }

}class Animal {

void breathe() { … }}class Human extends Animal, Whistler {}

Interfaces

Which breathe() should java run in class Human?

new Human().breathe();

Page 13: Recitation 4 Abstract classes, Interfaces. A Little More Geometry! Abstract Classes Shape x ____ y ____ Triangle area() base____ height ____ Circle area()

Why not make it fully abstract?

class abstract Whistler {abstract void breathe();

}class abstract Animal {

abstract void breathe();}class Human extends Animal, Whistler {}

Interfaces

Java doesn’t allow this, even though it would

work. Instead, Java has another construct for this

purpose, the interface

Page 14: Recitation 4 Abstract classes, Interfaces. A Little More Geometry! Abstract Classes Shape x ____ y ____ Triangle area() base____ height ____ Circle area()

Solution: Interfaces

public interface Whistler {void whistle();int MEANING_OF_LIFE= 42;

}

class Human extends Mammal implements Whistler {}

Interfaces

Must implement all methods in the implemented interfaces

● methods are automatically public and abstract

● fields are automatically public, static, and final (i.e. constants)

Page 15: Recitation 4 Abstract classes, Interfaces. A Little More Geometry! Abstract Classes Shape x ____ y ____ Triangle area() base____ height ____ Circle area()

Multiple interfaces

public interface Singer {void singTo(Human h);

}

class Human extends Mammal implements Whistler, Singer {}

Interfaces

Classes can implement several interfaces!

They must implement all the methods in those interfaces

they implement.

Must implement singTo(Human h) and whistle()

Page 16: Recitation 4 Abstract classes, Interfaces. A Little More Geometry! Abstract Classes Shape x ____ y ____ Triangle area() base____ height ____ Circle area()

Solution: Interfaces

Mammal

Human ParrotDog

Whistler

Interfaces

Bird

AnimalInterface Whistler offers promised functionality to classes Human and Parrot!

Page 17: Recitation 4 Abstract classes, Interfaces. A Little More Geometry! Abstract Classes Shape x ____ y ____ Triangle area() base____ height ____ Circle area()

Casting to an interface

Human h= new Human();Object o= (Object) h;Animal a= (Animal) h;Mammal m= (Mammal) h;

Singer s= (Singer) h;Whistler w= (Whistler) h;

All point to the same memory address!

Interfaces

Singer

Human

Mammal

Animal

Object

Whistler

Page 18: Recitation 4 Abstract classes, Interfaces. A Little More Geometry! Abstract Classes Shape x ____ y ____ Triangle area() base____ height ____ Circle area()

Casting to an interface

Human h= new Human();Object o= h;Animal a= h;Mammal m= h;Singer s= h;Whistler w= h;

Interfaces

Singer

Human

Mammal

Animal

Object

Whistler

Automaticup-cast

Forceddown-cast

Eric Chahin
Replace with lines
Page 19: Recitation 4 Abstract classes, Interfaces. A Little More Geometry! Abstract Classes Shape x ____ y ____ Triangle area() base____ height ____ Circle area()

Casting up to an interface automatically

class Human … implements Whistler {void listenTo(Whistler w) {...}}Human h = new Human(...);Human h1= new Human(...);h.listenTo(h1);

Interfaces

Human

Mammal

Animal

Object

WhistlerArg h1 of the call has type Human. Its value is being stored in w, which is of type Whistler. Java does an upward cast automatically. It costs no time; it is just a matter of perception.

Page 20: Recitation 4 Abstract classes, Interfaces. A Little More Geometry! Abstract Classes Shape x ____ y ____ Triangle area() base____ height ____ Circle area()

Demo 3: Implement Comparable<T>

Implement interface Comparable in class Shape:public interface Comparable<T> { /** = a negative integer if this object < c, = 0 if this object = c, = a positive integer if this object > c. Throw a ClassCastException if c can’t be cast to the class of this object. */ int compareTo(T c);}

Page 21: Recitation 4 Abstract classes, Interfaces. A Little More Geometry! Abstract Classes Shape x ____ y ____ Triangle area() base____ height ____ Circle area()

Shape implements Comparable<T>

public class Shape implements Comparable<Shape> { ... /** … */ public int compareTo(Shape s) { double diff= area() - s.area(); return (diff == 0 ? 0 : (diff < 0 ? -1 : +1)); }}

Page 22: Recitation 4 Abstract classes, Interfaces. A Little More Geometry! Abstract Classes Shape x ____ y ____ Triangle area() base____ height ____ Circle area()

Beauty of interfaces

Arrays.sort sorts an array of any class C, as long as C implements interface Comparable<T> without needing to know any implementation details of the class.

Classes that implement Comparable:

Boolean Byte Double IntegerString BigDecimal BigInteger Calendar Time Timestamp and 100 others

Page 23: Recitation 4 Abstract classes, Interfaces. A Little More Geometry! Abstract Classes Shape x ____ y ____ Triangle area() base____ height ____ Circle area()

String sorting

Arrays.sort(Object[] b) sorts an array of any class C, as long as C implements interface Comparable<T>.

String implements Comparable, so you can write String[] strings= ...; ... Arrays.sort(strings);

During the sorting, when comparing elements, a String’s compareTo function is used

Page 24: Recitation 4 Abstract classes, Interfaces. A Little More Geometry! Abstract Classes Shape x ____ y ____ Triangle area() base____ height ____ Circle area()

And Shape sorting, too!

Arrays.sort(Object[] b) sorts an array of any class C, as long as C implements interface Comparable<T>.

Shape implements Comparable, so you can write Shape[] shapes= ...; ... Arrays.sort(shapes);

During the sorting, when comparing elements, a Shape’s compareTo function is used

Page 25: Recitation 4 Abstract classes, Interfaces. A Little More Geometry! Abstract Classes Shape x ____ y ____ Triangle area() base____ height ____ Circle area()

Abstract Classes vs. Interfaces

● Abstract class represents something

● Sharing common code between subclasses

● Interface is what something can do

● A contract to fulfill● Software engineering

purpose

Similarities:● Can’t instantiate● Must implement abstract methods● Later we’ll use interfaces to define “abstract data types”

○ (e.g. List, Set, Stack, Queue, etc)