CSC 207.02 2019S, Class 11: List ADTs
Overview
- Preliminaries
- Notes and news
- Upcoming work
- Extra credit
- Questions
- Notes from Friday’s class
- The design of ADTs, revisited
- Scheme lists
- General lists
- Java lists
- Quick notes on implementation
- Quiz
Preliminaries
News / Etc.
- Welcome to any prospective students who may be here.
- Since we may have prospectives, the quiz will be at the end of
class, rather than the beginning.
- Please let me know when you see formatting errors on the class readings;
it’s usually that I’ve made a last-minute change and broken the
markdown.
- Sorry for issues on the Web site. Jekyll was not cooperating.
- Today is a lecture/discussion/recitation day. We’ll be working on
designing some abstract data types.
- Did you cover implementing queues with arrays and wraparound in CSC 161?
Yes. Yay!
Upcoming work
- Assignment 4 due Thursday night.
- Readings for Wednesday
- No lab writeup.
- CS Table, Tuesday, Noon, JRC 224B, Who Owns 3D Scans of Historic Sites?
Readings available at the back of the room.
- Grinnell Symphony, Wednesday, 7:30 p.m., in Sebring-Lewis
- CS Extras, Thursday, 4:15 p.m. Science 3821: Sam on CSC 321/22.
(Snacks at 4pm in the CS Commons.)
- Indoor Track and Field, Friday and Saturday, at Monmouth.
- HIIT training, 4:30 pm, Tuesday, Dance Studio, Bear. (Cap of two EC units.)
- HIIT training, 10:00 am, Saturday, Dance Studio, Bear (Same Cap.)
- Hatha Yoga, 7:00 pm, Tuesday, Dance Studo, Bear. (Cap of two EC units.)
- Other Yoga things. (Find them in the memo or the calendar.)
Other good things
Questions
Notes from Friday’s class
- On Friday, it is likely that you realized that Java determines whether
or not a method exists at compile time (static analysis), but determines
which implementation to use at run time (dynamic).
- We’ll go through some diagrams to help us understand the issues at play.
Two contexts
- Compile time: Compiler knows the structure of each class (and their
relationships), the declared type of variables.
- Run time: “Interpreter” knows the stack and the heap.
In case you’ve forgotten …
Counter
is an interface that specifies increment
, get
, and
reset
methods.
BasicCounter
is a simple implementation of Counter
.
DecrementableCounter
is a subclass of BasicCounter
that adds
a Decrement
method.
NamedCounter
is a subclass of BasicCounter
that overrides the
toString
method.
Let’s consider some issues.
Counter a = new BasicCounter(5); a.increment();
- Static analysis: a is a Counter. Every BasicCounter is a Counter,
so we can assign a new BasicCounter to a.
- Static analysis: a is a Counter. Every counter provides an
increment method. We can safely call a.increment()
- Run time: A refers to a reference on the stack. That reference
points to a BasicCounter object in the heap. That object has
a reference to its Class, which has a reference to the code.
- When we call a.increment() …
this
goes on the stack
- Follow references to object then class then code.
- Execute the code
Counter b = new DecrementableCounter(5); b.increment();
- Static analysis. Assignment is safe because DecrementableCounter
inherits from BasicCounter and BasicCounter implements Counter.
(Alternately every DecrementableCounter is a BasicCounter and
every BasicCounter is a Counter, so every DecrementableCounter
is a Counter.)
- Static analysis. Can we call
b.increment()
? Yes. b is a Counter,
Counters implement increment.
- Run time setup: See board. Note that the DecrementableCounter class has
a pointer to its superclass. (A superclass is the thing you
inherit from when you say “extends”.)
- Run time execution of increment:
this
goes on the stack, we follow
references to get the code for the current class; it does not include
increment, so we look in the superclass, that does include increment,
we run that code.
Detour: If every DecrementableCounter is a BasicCounter; why isn’t
every BasicCounter a DecrementableCounter?
- This is like a subset relationship. (subclasses represent subsets
of superclasses)
Question: What does extends
do?
- Gives you the fields of your superclass.
- Gives you the methods of your superclass.
Counter c = new DecrementableCounter(5); c.decrement();
- Initialization (see above)
- Is
c.decrement()
legal? No. The compiler says “You told me
c is a Counter. Counters lack a decrement method. Error!”
DecrementableCounter d = new DecrementableCounter(5); d.decrement();
- Static: Initialization is safe, same types.
- Static: Is
d.decrement()
legal? Yes. d is a DC. Every DC has
a decrement method.
BasicCounter e = new NamedCounter("count",5); e.toString();
- Named Counters are Basic Counters, assignment is legal.
- e.toString() - Every BasicCounter is a Counter, every Counter provides
a toString(), so the call is legal.
- At run time … we get the
toString()
method of NamedCounter
.
The particular method to run is identified at run time, not
compile time.
Suppose there is no toString
method in BasicCounter
(i.e., we use
the “default” method).
DecrementableCounter f = new DecrementableCounter(5); f.toString();
- Observation: Superclass of Counter is (implicit) Object class, which
has toString. We trace up to that.
DecrementableCounter g = new Counter(); ...
Counter
is not a class, so we can’t call a constructor.
- Not every
Counter
is a DecrementableCounter
(e.g.,, not every
Counter
has a decrement
method), so it won’t allow that.
- In general, you cannot assign a member of a superclass to a variable
of a subclass.
The design of ADTs, revisited
- Oh no, it’s time for more PUMishment!
- Philosophy
- Use cases
- Methods
- Idea: Write abstractly about our expectations before we think
about implementation.
- Permits us to choose multiple implementations.
Thinking about list ADTs (Philosophy)
- Mutable or immutable
- A mutable list might, for example, let us replace the second
element or remove an element.
- Fixed-size or dynamically-sized?
Scheme lists
Philosophy: An extensible, immutable, ordered collection of values
- Yes, when you build a list of length 20, you have effectively built
20 lists. But they share memory.
Methods (minimal set):
public interface SchemeList {
SchemeValue car();
SchemeList cdr();
SchemeList cons(SchemeValue val);
}
General lists
Java lists
Quick notes on implementation
Quiz
Leave when finished.