/* Date: Thu, 10 Mar 2005 16:00:22 +0000 (UTC) From: John B. Clements Newsgroups: ccs.courses.csu213 Subject: class code 2005-03-09 */ interface FIterator{ boolean hasMore(); Object getFirst(); FIterator getRest(); } interface HasSame{ boolean same(Object other); } class Airport { String name; List dests; Airport(String name, List dests){ this.name = name; this.dests = dests; } void addFlight(Airport newDest){ dests = new Cons(newDest,dests); } } abstract class List implements FIterator, HasSame { abstract boolean hasMore(); abstract Object getFirst(); abstract FIterator getRest(); // is 'this' object extensionally equivalent to 'other'? abstract boolean same(Object other); } class MT extends List { MT() { } boolean same(Object other) { if (other instanceof MT) return true; else return false; } boolean hasMore(){ return false; } Object getFirst(){ throw new UnsupportedOperationException(); } FIterator getRest(){ throw new UnsupportedOperationException(); } } class Cons extends List { Object first; List rest; Cons(Object first, List rest) { this.first = first; this.rest = rest; } boolean same(Object other) { if (other instanceof Cons) return (((HasSame)this.first).same(((Cons)other).first)) && (this.rest.same(((Cons)other).rest)) && true; else return false; } boolean hasMore(){ return true; } Object getFirst(){ return this.first; } FIterator getRest(){ return this.rest; } } class MyInteger implements HasSame{ int num; MyInteger(int num) { this.num = num; } boolean same(Object other){ if (other instanceof MyInteger) return ((MyInteger)other).num == this.num; else return false; } } class Examples{ Examples(){} MyInteger addList(FIterator f){ if (f.hasMore()) return new MyInteger(((MyInteger)f.getFirst()).num + addList(f.getRest()).num); else return new MyInteger(0); } List l1 = new MT(); List l2 = new Cons(new MyInteger(2),new Cons(new MyInteger(5), new MT())); // Object bad_test = this.l1.getFirst(); boolean t1 = addList(this.l2).same(new MyInteger(7)); Airport a1 = new Airport("Denver",new MT()); Airport a2 = new Airport("Logan",new MT()); Airport a3 = new Airport("LAX", new MT()); boolean tests() { a1.addFlight(a2); a2.addFlight(a1); a1.addFlight(a3); a2.addFlight(a3); a3.addFlight(a1); a3.addFlight(a2); return true; } boolean t2 = tests(); }