Interfaces and Abstract Classes in CS/ENGRD.2110.FALL.2016

undefined
 
CS/ENGRD 2110
FALL 2016
 
Lecture 7: Interfaces and Abstract Classes
http://courses.cs.cornell.edu/cs2110
 
1
 
Announcements
 
2
 
Attendance for this week’s recitation is mandatory!
A2 is due Today
Get started on A3 – a method every other day
 
A Little Geometry!
 
Abstract Classes
Shape
    x 
____
    y 
____
Triangle
   area()
   base
____
   height 
____
Circle
   area()
   radius 
_
_
5
_
_
Square
   area()
   size ____
 
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 required
2.
Adding new 
Shape
 subclasses breaks 
sumAreas
 
Abstract Classes
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”);
}
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.
 
Solution: Abstract classes
 
 
 
 
public 
abstract
 class 
Shape {
 
 
public double 
area() {
return 0;
}
}
 
 
 
 
 
 
Abstract Classes
Abstract class
Means that it c
an’t be instantiated.
new
 Shape()
 illegal
 
Solution: Abstract methods
 
 
 
public 
abstract
 class 
Shape {
 
  
public 
abstract
 double 
area();
 
}
 
 
 
 
 
 
Abstract Classes
 
Abstract method
Subclass must override.
 
Can 
also 
have
implemented
methods
 
Place abstract
method only in
abstract class.
 
Semicolon instead
of body.
 
 
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
 
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
undefined
 
Interfaces
Problem
Mammal
Human
Parrot
Dog
Whistler
Interfaces
Bird
Animal
Where is the best place to
implement 
whistle()
?
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();
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
 
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)
 
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()
Solution: Interfaces
Mammal
Human
Parrot
Dog
Whistler
Interfaces
Bird
Animal
Interface 
Whistler
 offers
promised functionality to classes
Human and Parrot!
 
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
 
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
 
Automatic
up-cast
 
Forced
down-cast
 
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
 
Whistler
Arg 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.
 
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);
}
 
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));
    }
}
 
 
 
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      Integer
String     BigDecimal  BigInteger  Calendar
Time       Timestamp   and 100 others
 
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
 
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
 
Abstract Classes vs. Interfaces
 
Abstract class represents
something
Sharing common code
between subclasses
 
Interface is what something can
do
A contract to fulfill
Software 
e
ngineering 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)
Slide Note
Embed
Share

This content covers the concepts of interfaces and abstract classes in a computer science/engineering lecture, discussing the implementation of shapes, method overriding, and the role of abstract classes in preventing instantiation. Various challenges and solutions related to abstract classes and methods are explored through demos and examples.

  • Interfaces
  • Abstract Classes
  • Computer Science
  • Engineering

Uploaded on Oct 02, 2024 | 0 Views


Download Presentation

Please find below an Image/Link to download the presentation.

The content on the website is provided AS IS for your information and personal use only. It may not be sold, licensed, or shared on other websites without obtaining consent from the author. Download presentation by click this link. If you encounter any issues during the download, it is possible that the publisher has removed the file from their server.

E N D

Presentation Transcript


  1. 1 CS/ENGRD 2110 FALL 2016 Lecture 7: Interfaces and Abstract Classes http://courses.cs.cornell.edu/cs2110

  2. Announcements 2 Attendance for this week s recitation is mandatory! A2 is due Today Get started on A3 a method every other day

  3. A Little Geometry! Abstract Classes Shape x ____ y ____ Square Circle Triangle area() size ____ area() radius __5__ area() base____ height ____

  4. Demo 1: Complete this function Abstract Classes /** Return the sum of the areas of * the shapes in s */ static double sumAreas(Shape[] s) { } 1. Operator instanceof and casting are required 2. Adding new Shape subclasses breaks sumAreas

  5. A Partial Solution: Abstract Classes Add method area to class Shape: public double area() { return 0; } public double area() { throw new RuntimeException( area not overridden ); }

  6. Problems not solved Abstract Classes 1. What is a Shape that isn t a Circle, Square, Triangle, etc? What is only a shape, nothing more specific? a.Shapes= new Shape(...); Should be disallowed 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.

  7. Solution: Abstract classes Abstract Classes Abstract class Means that it can t be instantiated. new Shape() illegal public abstract class Shape { public double area() { return 0; } }

  8. Solution: Abstract methods Abstract Classes Can also have implemented methods public abstract class Shape { public abstract double area(); Place abstract method only in abstract class. } Abstract method Subclass must override. Semicolon instead of body.

  9. Demo 2: A better solution Abstract Classes 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()

  10. Abstract Classes, Abstract Methods Abstract Classes 1. Cannot instantiate an object of an abstract class. (Cannot use new-expression) 2. A subclass must override abstract methods.

  11. Interfaces

  12. Problem Interfaces Where is the best place to implement whistle()? Animal Mammal Bird Whistler Human Dog Parrot

  13. No multiple inheritance in Java! Interfaces class Whistler { void breathe() { } } class Animal { void breathe() { } } class Human extends Animal, Whistler { } new Human().breathe(); Which breathe() should java run in class Human?

  14. Why not make it fully abstract? Interfaces class abstract Whistler { abstract void breathe(); } class abstract Animal { abstract void breathe(); } class Human extends Animal, Whistler { } Java doesn t allow this, even though it would work. Instead, Java has another construct for this purpose, the interface

  15. Solution: Interfaces Interfaces methods are automatically public and abstract publicinterface Whistler { void whistle(); int MEANING_OF_LIFE= 42; } fields are automatically public, static, and final (i.e. constants) class Human extends Mammal implements Whistler { } Must implement all methods in the implemented interfaces

  16. Multiple interfaces Interfaces Classes can implement several interfaces! publicinterface Singer { void singTo(Human h); } They must implement all the methods in those interfaces they implement. class Human extends Mammal implements Whistler, Singer { } Must implement singTo(Human h) and whistle()

  17. Solution: Interfaces Interfaces Interface Whistler offers promised functionality to classes Human and Parrot! Animal Mammal Bird Whistler Human Dog Parrot

  18. Casting to an interface Interfaces Human h= new Human(); Object o= (Object) h; Animal a= (Animal) h; Mammal m= (Mammal) h; Object Animal Singer s= (Singer) h; Whistler w= (Whistler) h; Whistler Mammal Singer All point to the same memory address! Human

  19. Casting to an interface Interfaces Human h= new Human(); Object o= h; Animal a= h; Mammal m= h; Singer s= h; Whistler w= h; Object Automatic up-cast Animal Whistler Mammal Singer Forced down-cast Human

  20. Casting up to an interface automatically Interfaces class Human implements Whistler { void listenTo(Whistler w) {...} } Human h = new Human(...); Human h1= new Human(...); h.listenTo(h1); Object Animal Whistler Mammal Arg 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. Human

  21. 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); }

  22. 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)); } }

  23. 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 Integer String BigDecimal BigInteger Calendar Time Timestamp and 100 others

  24. 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

  25. 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

  26. 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)

More Related Content

giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#