Lecture 23: Programming with Objects
CS150: Computer Science University of Virginia Computer Science
http://www.cs.virginia.edu/evans
David Evans
Reminder
• Start thinking of ideas of PS9 and discussing them on the forum
http://www.cs.virginia.edu/forums/viewforum.php?f=28
– You can also vote in the “should we have a quiz Monday” poll
http://www.cs.virginia.edu/forums/viewtopic.php?t=1651
http://www.sportsline.com/collegebasketball/scoreboard
Lecture 23: Programming with Objects
2
Problem-Solving Strategies
• PS1-PS4: Functional Programming
– Focused on procedures – Break a problem into procedures that can be combined to solve it
• PS5: Imperative Programming
– Focused on data – Design data for representing a problem and procedures for updating that data
Lecture 23: Programming with Objects
3
Problem-Solving Strategies
• PS6: “Object-Oriented Programming”
– Focused on objects: package procedures and state – Model a problem by dividing it into objects – Lots of problems in real (and imaginary) worlds can be thought of this way
Lecture 23: Programming with Objects
4
Counter Object
(define (make-counter) Instance variable (let ((count 0)) (lambda (message) (cond ((eq? message ‟reset!) Methods (set! count 0)) ((eq? message ‟next!) (set! count (+ 1 count))) ((eq? message ‟current) count) (else (error "Unrecognized message"))))))
Lecture 23: Programming with Objects
5
Defining ask
(ask Object Method)
> > 0 > > 1
(define bcounter (make-counter)) (ask bcounter 'current)
(ask bcounter 'next) (ask bcounter 'current)
(define (ask object message) (object message))
Lecture 23: Programming with Objects
6
Inheritance
Lecture 23: Programming with Objects
7
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
Lecture 23: Programming with Objects
8
make-fraction
(define make-fraction (lambda (numerator denominator) (lambda (message) (cond ((eq? message 'value) (lambda (self) (/ numerator denominator)) ((eq? message 'add) Same as in (lambda (self other) make-number (+ (ask self 'value) (ask other 'value))) ((eq? message „get-numerator) Note: our add (lambda (self) numerator)) method evaluates to a number, not ((eq? message „get-denominator) a fraction object (lambda (self) denominator)) (which would be ))))) better).
Lecture 23: Programming with Objects
9
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.)
Lecture 23: Programming with Objects
10
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))))))
Lecture 23: Programming with Objects
11
Making Subobjects
(define (make-fraction numer denom) (make-subobject (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 #f)))))
Lecture 23: Programming with Objects
12
Implementing make-subobject
(define (make-subobject super imp) (lambda (message) (if (eq? message ‟super) (lambda (self) super) (let ((method (imp message))) (if method method (super message))))))
Lecture 23: Programming with Objects
13
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
Lecture 23: Programming with Objects
14
> (trace ask) > (trace eq?) > (ask half 'add half) | | | | | | | | | | (eq? #f (eq? #f (eq? #f (eq? #f (eq? #t add value)
|(ask #
add #)
add get-denominator)
add get-numerator)
add value)
add add)
| (ask # value) | |(eq? value value) | |#t | 1/2 | (ask # value) | |(eq? value value) | |#t | 1/2 |1 1
15
Lecture 23: Programming with Objects
> (trace ask) > (trace eq?) > (ask half 'add half) | | | | | | | | | | (eq? #f (eq? #f (eq? #f (eq? #f (eq? #t add value)
make-number make-fraction
|(ask # add #)
add get-denominator)
add get-numerator)
add value)
add add)
| (ask # value) | |(eq? value value) | |#t | 1/2 | (ask # value) | |(eq? value value) | |#t | 1/2 |1 1
16
Lecture 23: Programming with Objects
Inheritance
Inheritance is using the definition of one class to make another class make-fraction uses make-number to inherit the behaviors of number
Lecture 23: Programming with Objects
17
Speaking about Inheritance
Fraction inherits from Number.
Number
Fraction is a subclass of Number.
Fraction
The superclass of Fraction is Number.
18
Lecture 23: Programming with Objects
PS6 Make an adventure game programming with objects Many objects in our game have similar properties and behaviors, so we use inheritance.
Lecture 23: Programming with Objects
19
PS6 Classes
sim-object place
make-class is the procedure for constructing objects in the class class
physical-object
mobile-object thing
student inherits from person which inherits from mobile-object which inherits from physical-object which inherits from sim-object.
person
student
20
police-officer
Lecture 23: Programming with Objects
PS6 Objects
object place
Cabal Hall Recursa
physical-object
mobile-object thing
person
(make-place name) evaluates to an object that is an instance of the class place.
student
Alyssa P. Hacker
Lecture 23: Programming with Objects
police-officer
21
Are there class hierarchies like this in the “real world” or just in fictional worlds like Charlottansville?
Lecture 23: Programming with Objects
22
Charge
• Monday:
– Quiz on GEB reading (depending on poll) – History of Object-Oriented Programming
• PS6 due Friday • Start thinking about PS9 project ideas
– Use the forum to find teammates and propose ideas
Lecture 23: Programming with Objects
23