Polymorphism
Hsuan-Tien Lin
Department of CSIE, NTU
OOP Class, April 8, 2013
H.-T. Lin (NTU CSIE) Polymorphism OOP 04/08/2013 0 / 26
Polymorphism: The Motto
One Thing, Many Shapes...
One Variable, Many Values
1 char a ;
2 s w i t c h( a ) {
3 case 1 :
4 r e t u r n 1 ∗ 1 ;
5 case 2 :
6 r e t u r n 2 ∗ 2 ;
7 case 3 :
8 r e t u r n 3 ∗ 3 ;
9 . . .
10 case 127:
11 r e t u r n 127 ∗ 127;
12 }
better ways?
mechanism? raw memory interpretation
H.-T. Lin (NTU CSIE) Polymorphism OOP 04/08/2013 2 / 26
One Class, Many Instances
1 S t u d e n t s ;
2 i f ( s e q u a l s s t u d e n t 1 )
3 show ( score1 ) ;
4 e l s e i f ( s e q u a l s s t u d e n t 2 )
5 show ( score2 ) ;
6 . . .
7 e l s e i f ( s e q u a l s s t u d e n t 1 0 0 )
8 show ( score100 ) ;
better ways?
mechanism? data abstraction
One Method Name, Many Parameter Lists
1 / / no o v e r l o a d i n g
2 System . o u t . p r i n t S t r i n g ( " abc " ) ;
3 System . o u t . p r i n t I n t ( 3 ) ;
4 System . o u t . p r i n t D o u b l e ( 4 . 0 ) ;
5 / / o v e r l o a d i n g
6 System . o u t . p r i n t ( " abc " ) ;
7 System . o u t . p r i n t ( 3 ) ;
8 System . o u t . p r i n t ( 4 . 0 ) ;
mechanism? signature by name + parameter types
H.-T. Lin (NTU CSIE) Polymorphism OOP 04/08/2013 4 / 26
A Twist in Method Overloading
1 / / o v e r l o a d i n g
2 System . o u t . p r i n t ( " abc " ) ;
3 System . o u t . p r i n t ( 3 ) ;
4 System . o u t . p r i n t ( 4 . 0 ) ;
5 / / a t w i s t ( o f course , n o t e x a c t l y workable
6 S t r i n g ( " abc " ) . p r i n t ( ) ;
7 I n t e g e r ( 3 ) . p r i n t ( ) ;
8 Double ( 4 . 0 ) . p r i n t ( ) ;
mechanism? just write print() for every class (we’ll see)
Polymorphic Behavior
all cases above: some polymorphic behavior BUT almost no one calls them real “polymorphism”
Why Not?
H.-T. Lin (NTU CSIE) Polymorphism OOP 04/08/2013 6 / 26
Polymorphic Behavior on Known Stuff
polymorphic behavior ofknown primitive-type variables polymorphic behavior ofknown classes (extended types) polymorphic behavior ofknown parameter types
Unknown Stuff: Future Extensions
Backward Compatibility inheritance hierarchy
Forward Advance
newly added variables/methods
H.-T. Lin (NTU CSIE) Polymorphism OOP 04/08/2013 8 / 26
Polymorphism of Instance Content
one advanced content, many compatible ways to access
Polymorphism of Instance References
onecompatible reference, many advanced contents to point to
H.-T. Lin (NTU CSIE) Polymorphism OOP 04/08/2013 10 / 26
Reference Upcast versus Reference Downcast
1 CSIEProfessor c = new CSIEProfessor ( ) ;
2 P r o f e s s o r p = c ;
3 / / P r o f e s s o r p = new CSIEProfessor ( ) ;
Upcast
simple (backward compatibility)
1 CSIEProfessor c = new CSIEProfessor ( ) ;
2 P r o f e s s o r p = c ;
3 CSIEProfessor c2 = ( CSIEProfessor ) p ;
Downcast
need to check whether content fits (forward advance)
Content/Reference Polymorphism: Summary
backward compatibility handled
forward advance: only via downcast (RTTI)
simpler mechanism for forward advance?
H.-T. Lin (NTU CSIE) Polymorphism OOP 04/08/2013 12 / 26
Our Needs in Forward Advance
new instance variables for advanced state
new instance methods to manipulate new variables give new meanings to existing instance variables give new meanings to existing instance methods
write an “updated but compatible” version of existing method
Method Overriding (Virtual Function)
calls the updated version through an upper-level reference
H.-T. Lin (NTU CSIE) Polymorphism OOP 04/08/2013 14 / 26
Method Invocation Polymorphism
one method (via upper-level reference),
many possible extended behaviors
Object.equals
1 c l a s s C o o r d i n a t e extends O b j e c t {
2 double x , y ;
3
4 b o o l e q u a l s ( O b j e c t o ) {
5 i f ( o i n s t a n c e o f C o o r d i n a t e ) {
6 C o o r d i n a t e c = ( C o o r d i n a t e ) o ;
7 r e t u r n ( c . x == t h i s. x && c . y == t h i s. y ) ;
8 }
9 r e t u r n f a l s e;
10 }
11 }
H.-T. Lin (NTU CSIE) Polymorphism OOP 04/08/2013 16 / 26
Object.toString
1 C o o r d i n a t e c = new C o o r d i n a t e ( ) ;
2 System . o u t . p r i n t l n ( c ) ;
Twist Revisited
1 System . o u t . p r i n t ( " abc " ) ;
2 System . o u t . p r i n t ( 3 ) ;
3 System . o u t . p r i n t ( 4 . 0 ) ;
4 / / a t w i s t ( o f course , n o t e x a c t l y workable
5 S t r i n g ( " abc " ) . p r i n t ( ) ;
6 I n t e g e r ( 3 ) . p r i n t ( ) ;
7 Double ( 4 . 0 ) . p r i n t ( ) ;
System.out.print(Object) can have polymorphic behavior by internally calling the updated Object.print() (actually, Object.toString()) without overloading
H.-T. Lin (NTU CSIE) Polymorphism OOP 04/08/2013 18 / 26
V-Table: A Possible Mechanism of Method Overriding
RTTI revisited
all we need is a link to the class area (stores name, vtable, etc.) where is the link? java.lang.Object
how to access? Object.getClass()
each area is an instance of java.lang.Class
H.-T. Lin (NTU CSIE) Polymorphism OOP 04/08/2013 20 / 26
Summary on Polymorphism
one thing, many shapes
important in strongly-typed platforms with inheritance
view from content: one advanced content with many compatible access
view from reference: one compatible reference can point to many advanced contents
view from method: one compatible method “contract”, many different method “realization”
Abstract Class (1/3)
1 p u b l i c c l a s s P r o f e s s o r ( ) {
2 p u b l i c v o i d t eac h ( ) {
3 System . o u t . p r i n t l n ( " n o t sure o f what t o te ach ! " ) ;
4 }
5 }
6 c l a s s CSIEProfessor extends P r o f e s s o r {
7 p r i v a t e v o i d teach_oop ( ) { / ∗ l a l a l a ∗ / }
8 p u b l i c v o i d t eac h ( ) { teach_oop ( ) ; }
9 }
10 c l a s s EEProfessor extends P r o f e s s o r {
11 p r i v a t e v o i d t e a c h _ e l e c ( ) { / ∗ l u l u l u ∗ / }
12 p u b l i c v o i d t eac h ( ) { t e a c h _ e l e c ( ) ; }
13 }
14 / / i n o t h e r p l a c e s
15 P r o f e s s o r p = new P r o f e s s o r ( ) ;
16 p . t eac h ( ) ; / / n o t sure o f what t o tea ch !
teachis a place-holder in Professor, expected to be overridden allows constructing a professor without any teaching ability!
—absurd in some sense
H.-T. Lin (NTU CSIE) Polymorphism OOP 04/08/2013 22 / 26
Abstract Class (2/3)
1 p u b l i c a b s t r a c t c l a s s P r o f e s s o r ( ) {
2 p u b l i c a b s t r a c t v o i d t eac h ( ) ;
3 }
4 c l a s s CSIEProfessor extends P r o f e s s o r {
5 p r i v a t e v o i d teach_oop ( ) { / ∗ l a l a l a ∗ / }
6 p u b l i c v o i d t eac h ( ) { teach_oop ( ) ; }
7 }
8 c l a s s EEProfessor extends P r o f e s s o r {
9 p r i v a t e v o i d t e a c h _ e l e c ( ) { / ∗ l u l u l u ∗ / }
10 p u b l i c v o i d t eac h ( ) { t e a c h _ e l e c ( ) ; }
11 }
12 / / i n o t h e r p l a c e s
13 P r o f e s s o r p = new P r o f e s s o r ( ) ; / / hahaha ! !
14 P r o f e s s o r p = new CSIEProfessor ( ) ; / / okay
Key Point: Abstract Class
acontract for future extensions
H.-T. Lin (NTU CSIE) Polymorphism OOP 04/08/2013 25 / 26
Final Words
static finalvariable: accessed through class, and assigned once (in declaration or static constructor)
finalinstance variable: accessed through instance, and assigned once (in declaration or every instance constructor) finalinstance method: cannot be overriden (≈ assigned once) static finalmethod: cannot be hidden by inheritance (≈
assigned once)
finalclass: cannot be inherited (and hence all methods final)