250 likes | 258 Views
Learn about inheritance in object-oriented programming, its benefits, and why it is important. Explore examples and understand how it allows for code reusability and organization.
E N D
David Evans http://www.cs.virginia.edu/~evans Lecture 21: Inheritance CS200: Computer Science University of Virginia Computer Science
Menu • Objects Review • Inheritance • PS6 CS 200 Spring 2002
Objects • When we package state and procedures together we have an object • Programming with objects is object-oriented programming CS 200 Spring 2002
make-number (define make-number (lambda (n) (lambda (message) (cond ((eq? message 'value) (lambda (self) n)) ((eq? message 'add) (lambda (self other) (+ (ask self 'value) (ask other 'value)))))))) Why don’t we just use n? (Well see why later today.) CS 200 Spring 2002
ask Lecture 20: (define (ask object message) (object message)) (define (ask object message . args) (apply (object message) object args)) CS 200 Spring 2002
(define make-number (lambda (n) (lambda (message) (cond ((eq? message 'value) (lambda (self) n)) ((eq? message 'add) (lambda (self other) (+ (ask self 'value) (ask other 'value)))))))) global environment + : #<primitive:+> make-number: san: > (define san (make-number 3)) > (ask san 'value) 3 > (ask san 'add (make-number 4)) 7 3 n : parameters: body: ((lambda … parameters: message body: (cond ((eq? … CS 200 Spring 2002
There are many kinds of numbers… • Whole Numbers (0, 1, 2, …) • Integers (-23, 73, 0, …) • Fractions (1/2, 7/8, …) • Floating Point (2.3, 0.0004, 3.14159) • But they can’t all do the same things • We can get the denominator of a fraction, but not of an integer CS 200 Spring 2002
make-fraction (define make-fraction (lambda (numerator denominator) (lambda (message) (cond ((eq? message 'value) (lambda (self) (/ numerator denominator)) ((eq? message 'add) (lambda (self other) (+ (ask self 'value) (ask other 'value))) ((eq? message ‘get-numerator) (lambda (self) numerator)) ((eq? message ‘get-denominator) (lambda (self) denominator)) ))))) Same as in make-number CS 200 Spring 2002
Why is redefining add a bad thing? • Cut-and-paste is easy but… • There could be lots of number methods (subtract, multiply, print, etc.) • Making the code bigger makes it harder to understand • If we fix a problem in the number add method, we have to remember to fix the copy in make-fraction also (and real, complex, float, etc.) CS 200 Spring 2002
Inheritance CS 200 Spring 2002
make-fraction (define (make-fraction numer denom) (let ((super (make-number #f))) (lambda (message) (cond ((eq? message 'value) (lambda (self) (/ numer denom))) ((eq? message 'get-denominator) (lambda (self) denom)) ((eq? message 'get-numerator) (lambda (self) numer)) (else (super message)))))) CS 200 Spring 2002
Using Fractions > (define half (make-fraction 1 2)) > (ask half 'value) 1/2 > (ask half 'get-denominator) 2 > (ask half 'add (make-number 1)) 3/2 > (ask half 'add half) 1 CS 200 Spring 2002
> (trace ask) > (trace eq?) > (ask half 'add half) |(ask #<procedure> add #<procedure>) | (eq? add value) | #f | (eq? add get-denominator) | #f | (eq? add get-numerator) | #f | (eq? add value) | #f | (eq? add add) | #t | (ask #<procedure> value) | |(eq? value value) | |#t | 1/2 | (ask #<procedure> value) | |(eq? value value) | |#t | 1/2 |1 1 CS 200 Spring 2002
make-number make-fraction > (trace ask) > (trace eq?) > (ask half 'add half) |(ask #<procedure> add #<procedure>) | (eq? add value) | #f | (eq? add get-denominator) | #f | (eq? add get-numerator) | #f | (eq? add value) | #f | (eq? add add) | #t | (ask #<procedure> value) | |(eq? value value) | |#t | 1/2 | (ask #<procedure> value) | |(eq? value value) | |#t | 1/2 |1 1 CS 200 Spring 2002
Inheritance Inheritance is using the definition of one class to make another class make-fraction uses make-number to inherit the behaviors of number CS 200 Spring 2002
Number • English A Fraction is a special kind of Number. • C++ Fraction is a derived class whose base class is Number • Java Fraction extends Number. • Eiffel Fraction inherits from Number. • Beta Fraction is a subpattern of Number. • Smalltalk (72) Didn’t have inheritance! Fraction Note: people draw this different ways (some times the arrow points the opposite way) CS 200 Spring 2002
Number • CS 200 Fraction inherits from Number. Fraction is a subclass of Number. The superclass of Fraction is Number. Fraction Note: people draw this different ways (some times the arrow points the opposite way) CS 200 Spring 2002
Inheritance and Subtyping • Inheritance: reusing the implementation of one object to make a new kind of object • Often confused with subtyping which is saying one kind of object can be used where another kind of object is expected • We will cover types and subtyping after Spring Break, just warning you now CS 200 Spring 2002
PS6Make an adventure game programming with objects. CS 200 Spring 2002
object PS6 Classes physical-object place make-class is the procedure for constructing objects in the class class mobile-object thing person student police-officer make-student constructs a student. The student class inherits from person, which inherits from mobile-object, which inherits from physical-object, which inherits from object.
object PS6 Objects physical-object place Cabal Hall mobile-object Recursa (make-place name) evaluates to an object that is an instance of the class place. thing person student police-officer Officer Krispy Alyssa P. Hacker
Are there class hierarchies like this in the real world or just in fictional worlds like Charlatansville? CS 200 Spring 2002
Microsoft Foundation Classes CButton inherits from CWnd inherits from CObject “A button is a kind of window is a kind of object” CS 200 Spring 2002
RotationPathInterpolator PathInterpolator Interpolator Node Selector Leaf SceneGraphObject Not at all uncommon to have class hierarchies like this! Java 3D Class Hierarchy Diagram http://java.sun.com/products/java-media/3D/collateral/j3dclass.html CS 200 Spring 2002
Charge • PS6 • Programming with Objects • Spring Break • Read rest of GEB, Part I • Reading questions on the Notes today CS 200 Spring 2002