• 沒有找到結果。

Inheritance 11/02/2015 Hsuan-Tien Lin (

N/A
N/A
Protected

Academic year: 2022

Share "Inheritance 11/02/2015 Hsuan-Tien Lin ("

Copied!
23
0
0

加載中.... (立即查看全文)

全文

(1)

Inheritance

11/02/2015

Hsuan-Tien Lin (林軒田) htlin@csie.ntu.edu.tw

Department of Computer Science

& Information Engineering

National Taiwan University

( 國立台灣大學資訊工程系)

(2)

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

(3)

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

(4)

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

(5)

Has-A: Key Point

most basic design component of OOP

(6)

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 }

SYSOP

is a user

can be implemented via

has-a

—everyone has a child living in his heart—

but complicated

(7)

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 }

TypeA

extends TypeB: TypeA is a (special case of) TypeB

TypeSubClass (TypeDerivedClass or ChildClass)

extends

TypeSuperClass (or TypeBaseClass or ParentClass)

another way of reusing code

(8)

Is-A: Key Point

is-a 6= has-a

extends better suited for the former

(9)

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) CassetePlayer

(10)

Uses 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) Player

(11)

Uses 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 World

(12)

Uses 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 inheritance

(13)

Use 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?

(14)

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 of

extend for is-a: one class describes one instance

usual goal of OOP: one class,

many instances

(15)

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 of

extend for is-a: overly complicated class

CSIEProfessor

potential for bugs/hacks

what if new CSIEProfessor("YAOMMENT", "Chair", 0)?

(16)

More on Is-A: Key Point

class ViceChair extends Professor is a kind (type) of

Professor HTLin = new Professor() is an instance of

(17)

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

(18)

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?

(19)

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 sees

(20)

Instance 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 type

(21)

Instance 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

(22)

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?

(23)

Instance Methods and Inheritance: Key Point

instance method binding: dynamic, depending on run-time instance types

參考文獻

相關文件

(Inheritance) ;c.動態繫合(Dynamic binding) ;d.動態範圍(Dynamic scoping).

Machine Learning for Modern Artificial Intelligence.. Hsuan-Tien

Hsuan-Tien Lin (NTU CSIE) Machine Learning Basics

Lecture 5: Training versus Testing Hsuan-Tien Lin (林 軒田) htlin@csie.ntu.edu.tw?. Department of

Hsuan-Tien Lin (NTU CSIE) Machine Learning Techniques 3/24.:. Deep Learning Deep

private methods effectively not inherited be- cause not “visible” to the subclass.. More on Access Permissions:

final instance variable: accessed through instance, and assigned once (in declaration or every instance constructor) final instance method: cannot be overriden (≈ assigned once)

/** Class invariant: A Person always has a date of birth, and if the Person has a date of death, then the date of death is equal to or later than the date of birth. To be