Inheritance
11/02/2015
Hsuan-Tien Lin (林軒田) htlin@csie.ntu.edu.tw
Department of Computer Science
& Information Engineering
National Taiwan University
( 國立台灣大學資訊工程系)
Has-A (1/3)
1 c l a s s Person {
2 S t r i n g name ; Pet p e t ;
3 v o i d s i n g ( ) {
4 System . o u t . p r i n t ( name + " has a " + p e t . t y p e + " , " ) ;
5 System . o u t . p r i n t l n ( p e t . t y p e + " , " + p e t . t y p e + " . " ) ;
6 }
7 }
8 c l a s s Pet { S t r i n g t y p e ; }
9 p u b l i c c l a s s PetDemo {
10 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] argv ) {
11 Person mary = new Person ( ) ;
12 mary . name = " Mary " ;
13 mary . p e t = new Pet ( ) ;
14 mary . p e t . t y p e = " l i t t l e lamb " ;
15 mary . s i n g ( ) ;
16 }
17 }
•
has-a: a basic way of re-using variables/methods in other classes•
“Mary has a little lamb.”Has-A (2/3)
1 c l a s s POOBBS{
2 POOBoard board ;
3 POOMessage message ;
4 POOVote v o t e ;
5 POOCasino c a s i n o ;
6 POOMail m a i l ;
7 }
•
has-a: a basic way of defining the components of a system•
“POOBBS has a casino system.”Has-A (3/3)
1 c l a s s User {
2 User [ ] f r i e n d l i s t ;
3 i n t f r i e n d c o u n t ;
4 v o i d addFriend ( User f r i e n d ) {
5 f r i e n d l i s t [ f r i e n d c o u n t ++] = f r i e n d ;
6 }
7 }
•
has-a: a basic mechanism for objects to “connect” with each other•
“He has two friends: George and Mary.”Has-A: Key Point
most basic design component of OOP
Is-A (1/2)
1 c l a s s SYSOP{
2 User user ;
3 v o i d t a l k _ t o _ f r i e n d ( User a_user ) {
4 user . t a l k _ t o _ f r i e n d ( a_user ) ;
5 }
6 v o i d t a l k _ t o _ s y s o p (SYSOP a_sysop ) {
7 t a l k _ t o _ f r i e n d ( a_sysop . user ) ;
8 }
9 v o i d reset_user_money ( User a_user ) {
10 a_user . money = 0 ;
11 }
12 v o i d reset_sysop_money (SYSOP a_sysop ) {
13 reset_user_money ( a_sysop . user ) ;
14 }
15 }
•
SYSOPis a user
•
can be implemented viahas-a
—everyone has a child living in his heart—
but complicated
Is-A (2/2)
1 c l a s s User {
2 i n t money ;
3 v o i d t a l k _ t o _ f r i e n d ( User a_user ) { }
4 }
5 c l a s s SYSOP extends User {
6 / / money " i n h e r i t e d " from t h e d e f i n i t i o n above
7 / / t a l k _ t o _ f r i e n d " i n h e r i t e d " from t h e d e f i n i t i o n above
8
9 v o i d reset_user_money ( User a_user ) {
10 a_user . money = 0 ;
11 }
12 / / reset_sysop_money no need , because SYSOP i s a User
13 }
•
TypeAextends TypeB: TypeA is a (special case of) TypeB
•
TypeSubClass (TypeDerivedClass or ChildClass)extends
TypeSuperClass (or TypeBaseClass or ParentClass)•
another way of reusing codeIs-A: Key Point
is-a 6= has-a
extends better suited for the former
Uses of Is-A (1/4)
1 c l a s s C a s se t eP l a ye r {
2 v o i d p l a y ( Cassete c ) { }
3 }
4 c l a s s CDandCassetePlayer extends Ca s se t e Pl a ye r {
5 / / p l a y ( Cassete ) i n h e r i t e d
6 v o i d p l a y (CD c ) { }
7 }
•
CDandCassetePlayer is a (extended) CassetePlayerUses of Is-A (2/4)
1 c l a s s P l a y e r {
2 v o i d p l a y ( ) { }
3 }
4 c l a s s C a s se t eP l a ye r extends P l a y e r {
5 v o i d p l a y ( Cassete c ) { i n s e r t ( c ) ; p l a y ( ) ; }
6 }
7 c l a s s CDPlayer extends P l a y e r {
8 v o i d p l a y (CD c ) { i n s e r t ( c ) ; p l a y ( ) ; }
9 }
•
CassetePlayer is a (concrete description of) Player•
CDPlayer is a (concrete description of) PlayerUses of Is-A (3/4)
1 c l a s s C a s se t eP l a ye r {
2 v o i d p l a y ( Cassete c ) { }
3 }
4 c l a s s CDPlayer extends Ca s se t e Pl a ye r {
5 v o i d p l a y ( Cassete c ) {
6 System . o u t . p r i n t l n ( " I cannot p l a y Cassete " ) ;
7 }
8 v o i d p l a y (CD c ) { }
9 }
•
CDPlayer is a (update of my) CassetePlayer•
some behaviors “changed” (will discuss in more detail later)•
not semantically as clear as the previous cases, but a potential trick in the OO WorldUses of Is-A (4/4)
1 c l a s s P l a y e r {
2 v o i d p l a y ( ) { }
3 }
4 c l a s s C a s se t eP l a ye r extends P l a y e r {
5 v o i d p l a y ( Cassete c ) { i n s e r t ( c ) ; p l a y ( ) ; }
6 }
7 c l a s s CDPlayer extends P l a y e r {
8 v o i d p l a y (CD c ) { i n s e r t ( c ) ; p l a y ( ) ; }
9 }
10 c l a s s CDandCassetePlayer extends Ca s se t e Pl a ye r and CDPlayer {
11 / / p l a y ( Cassete ) i n h e r i t e d
12 / / p l a y (CD) i n h e r i t e d
13 }
•
multiple inheritance:not supported in Java
•
think: Professor CharlieL and Alumnus CxxxxxxL conflict•
Java: basically, single inheritanceUse of Is-A: Key Point
•
is an extended type of—FunProfessor is Professor who can also tell jokes
•
is a more concrete/restricted description of—YoungProfessor is Professor who is young
•
(is an update of)—NewProfessor replaces ExistingProfessor
•
is a TypeA and is a TypeB (no!)—both Fun and Young?
More on Is-A (1/2)
1 c l a s s CSIEProfessor { S t r i n g name ; i n t o f f i c e _ n u m ; }
2 c l a s s HTLin extends CSIEProfessor {
3 / / HTLin i s a CSIEProfessor
4 HTLin ( ) { name = " HTLin " ; o f f i c e _ n u m = 314; }
5 }
6 c l a s s CLChen extends CSIEProfessor {
7 / / CLChen i s a CSIEProfessor
8 S t r i n g t i t l e ;
9 CLChen ( ) {
10 name = " CLChen " ; o f f i c e _ n u m = 500; t i t l e = " Vice C h a i r " ;
11 }
12 }
13 c l a s s YDLyuu extends CSIEProfessor {
14 / / YDLyuu i s a CSIEProfessor
15 S t r i n g t i t l e ;
16 YDLyuu ( ) {
17 name = " YDLyuu " ; o f f i c e _ n u m = 200; t i t l e = " C h a i r " ;
18 }
19 }
•
over-use ofextend for is-a: one class describes one instance
•
usual goal of OOP: one class,many instances
More on Is-A (2/2)
1 c l a s s CSIEProfessor {
2 S t r i n g name ; S t r i n g t i t l e ;
3 i n t o f f i c e _ n u m ;
4 CSIEProfessor ( S t r i n g name , S t r i n g t i t l e , i n t o f f i c e _ n u m ) { }
5 b o o l i s _ c h a i r ( ) { r e t u r n t i t l e . e q u a l s ( " C h a i r " ) ; }
6 b o o l decide_budget ( ) { i f ( i s _ c h a i r ( ) ) { / ∗ . . . ∗ / } }
7 }
8
9 c l a s s CSIEProfessorDemo {
10 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] argv ) {
11 CSIEProfessor = new CSIEProfessor ( " YDLyuu " , " C h a i r " , 2 0 0 ) ;
12 YDLyuu . decide_budget ( ) ;
13 }
14 }
•
under-use ofextend for is-a: overly complicated class
CSIEProfessor•
potential for bugs/hackswhat if new CSIEProfessor("YAOMMENT", "Chair", 0)?
More on Is-A: Key Point
class ViceChair extends Professor is a kind (type) of
Professor HTLin = new Professor() is an instance of
Instance Variables and Inheritance (1/3)
1 c l a s s P r o f e s s o r {
2 p u b l i c S t r i n g name ;
3
4 p u b l i c S t r i n g get_name ( ) {
5 r e t u r n name ;
6 }
7 }
8 c l a s s CSIEProfessor extends P r o f e s s o r {
9 p u b l i c i n t o f f i c e _ n u m b e r ;
10 p u b l i c i n t g e t _ o f f i c e _ n u m b e r ( ) {
11 r e t u r n o f f i c e _ n u m b e r ;
12 }
13 }
•
CSIEProfessor: two instance variables;Professor: one instance variable
Instance Variables and Inheritance (2/3)
1 c l a s s P r o f e s s o r {
2 p u b l i c S t r i n g name ;
3 p u b l i c S t r i n g get_name ( ) { r e t u r n name ; }
4 }
5 c l a s s CSIEProfessor extends P r o f e s s o r {
6 p u b l i c S t r i n g name ; / / ? !
7 p u b l i c i n t o f f i c e _ n u m b e r ;
8 p u b l i c i n t g e t _ o f f i c e _ n u m b e r ( ) { r e t u r n o f f i c e _ n u m b e r ; }
9 p u b l i c S t r i n g get_this_name ( ) { r e t u r n name ; }
10 }
11 / ∗ CSIEProfessor HTLin = new CSIEProfessor ( ) ;
12 P r o f e s s o r HTLin = new CSIEProfessor ( ) ;
13 P r o f e s s o r HTLin = new P r o f e s s o r ( ) ; ∗ /
14 / ∗ System . o u t . p r i n t l n ( HTLin . get_name ( ) ) ;
15 System . o u t . p r i n t l n ( HTLin . get_this_name ( ) ) ;
16 System . o u t . p r i n t l n ( HTLin . name ) ; ∗ /
•
CSIEProfessor: three instance variables;Professor: one instance variable
•
which name will we get?Instance Variables and Inheritance (3/3)
1 c l a s s P r o f e s s o r {
2 p u b l i c S t r i n g p_name ;
3 p u b l i c S t r i n g get_name ( ) { r e t u r n p_name ; }
4 }
5 c l a s s CSIEProfessor extends P r o f e s s o r {
6 p u b l i c S t r i n g c_name ;
7 p u b l i c i n t o f f i c e _ n u m b e r ;
8 p u b l i c i n t g e t _ o f f i c e _ n u m b e r ( ) { r e t u r n o f f i c e _ n u m b e r ; }
9 p u b l i c S t r i n g get_this_name ( ) { r e t u r n c_name ; }
10 }
•
an (almost) equivalent view of what the compiler seesInstance Variables and Inheritance: Key Point
•
instance variable binding: determined at compile time•
same “name” can co-exist in a derived class, binding determined by compile-time typeInstance Methods and Inheritance (1/2)
1 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 s a y _ h e l l o ( ) {
3 System . o u t . p r i n t l n ( " H e l l o ! " ) ;
4 }
5 }
6 c l a s s CSIEProfessor extends P r o f e s s o r {
7 p u b l i c v o i d play_BBS ( ) {
8 System . o u t . p r i n t l n ( " Fun ! " ) ;
9 }
10 }
•
CSIEProfessor: two instance methods;Professor: one instance method
Instance Methods and Inheritance (2/2)
1 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 s a y _ h e l l o ( ) {
3 System . o u t . p r i n t l n ( " H e l l o ! " ) ;
4 }
5 }
6 c l a s s CSIEProfessor extends P r o f e s s o r {
7 p u b l i c v o i d s a y _ h e l l o ( ) {
8 System . o u t . p r i n t l n ( " May t h e OOP course be w i t h you ! " ) ;
9 }
10 }
11 / ∗ a l t e r n a t i v e s
12 CSIEProfessor HTLin = new CSIEProfessor ( ) ;
13 P r o f e s s o r HTLin = new CSIEProfessor ( ) ;
14 P r o f e s s o r HTLin = new P r o f e s s o r ( ) ;
15 ∗ /
16 / ∗ c a l l s
17 HTLin . s a y _ h e l l o ( ) ;
18 ∗ /
•
which say_hello() will be called?Instance Methods and Inheritance: Key Point
instance method binding: dynamic, depending on run-time instance types