Chair of Software Engineering OOSC Summer Semester Object-Oriented Software Construction Bertrand Meyer
Chair of Software Engineering OOSC Summer Semester Lecture 8: Inheritance
Chair of Software Engineering OOSC Summer Semester Typing vs. binding What do we know about the feature to be called? Static typing: At least one Dynamic binding: The right one Example: my_aircraft.lower_landing_gear
Chair of Software Engineering OOSC Summer Semester Example hierarchy AIRCRAFT * PLANE * COPTER * BOEINGAIRBUS A_320 B_747B_737 B_747_400 * deferred + effected ++ redefined lower_landing_gear* lower_landing_gear++ lower_landing_gear+
Chair of Software Engineering OOSC Summer Semester (After Barry W. Boehm) RequirementsDesignCodeDevelopmentAcceptanceOperation test SMALL PROJECTS LARGE PROJECTS
Chair of Software Engineering OOSC Summer Semester Multiple inheritance A class may have two or more parents. What not to use as an elementary example: TEACHING_ASSISTANT inherits from TEACHER and STUDENT. TEACHERSTUDENT TEACHING_ ASSISTANT
Chair of Software Engineering OOSC Summer Semester The teaching assistant example This is in fact a case of repeated inheritance: TEACHERSTUDENT TEACHING_ ASSISTANT UNIVERSITY_ MEMBER id ?? ????
Chair of Software Engineering OOSC Summer Semester Common examples of multiple inheritance Combining separate abstractions: Restaurant, train car Calculator, watch Plane, asset
Chair of Software Engineering OOSC Summer Semester Multiple inheritance: Combining abstractions COMPARABLENUMERIC STRINGCOMPLEX INTEGER REAL DOUBLE **
Chair of Software Engineering OOSC Summer Semester Multiple inheritance: Nested windows ‘‘Graphical’’ features: height, width, change_height, change_width, xpos, ypos, move... ‘‘Hierarchical’’ features: superwindow, subwindows, change_subwindow, add_subwindow... class WINDOW inherit RECTANGLE TREE [WINDOW] feature... end
Chair of Software Engineering OOSC Summer Semester Multiple inheritance: Composite figures A composite figure Simple figures
Chair of Software Engineering OOSC Summer Semester Defining the notion of composite figure FIGURE LIST [FIGURE] COMPOSITE_ FIGURE * display* hide rotate move … count put remove … display +
Chair of Software Engineering OOSC Summer Semester Defining the notion of composite figure through multiple inheritance FIGURE LIST [FIGURE] COMPOSITE_ FIGURE * OPEN_ FIGURE CLOSED_ FIGURE SEGMENT POLYLINE POLYGON ELLIPSE RECTANGLE SQUARE CIRCLE TRIANGLE … perimeter+ perimeter* perimeter++ perimeter+ diagonal …
Chair of Software Engineering OOSC Summer Semester A composite figure as a list start item forthafter
Chair of Software Engineering OOSC Summer Semester Composite figures class COMPOSITE_FIGURE inherit FIGURE redefine display, move, rotate,... end LIST [FIGURE] feature display is -- Display each constituent figure in turn. do from start until after loop item.display forth end end... Similarly for move, rotate etc.... end
Chair of Software Engineering OOSC Summer Semester Complex figures Note: a simpler form of procedures display, move etc. can be obtained through the use of iterators. Exercise: Use agents for that purpose.
Chair of Software Engineering OOSC Summer Semester Name clashes under multiple inheritance A C foo B
Chair of Software Engineering OOSC Summer Semester Resolving name clashes A C foo B rename foo as fogrename foo as zoo
Chair of Software Engineering OOSC Summer Semester Resolving name clashes (cont’d) class C inherit A rename foo as fog end B rename foo as zoo end feature...
Chair of Software Engineering OOSC Summer Semester Results of renaming a1: A b1: B c1: C... c1.fog c1.zoo a1.foo b1.foo Invalid: a1.fog, a1.zoo, b1.zoo, b1.fog, c1.foo
Chair of Software Engineering OOSC Summer Semester Another application of renaming Provide locally better adapted terminology. Example: child (TREE); subwindow (WINDOW).
Chair of Software Engineering OOSC Summer Semester The marriage of convenience class ARRAYED_STACK [G] inherit STACK [G] ARRAY [G] feature... end class LINKED_STACK [G] inherit STACK [G] LINKED_LIST [G] feature... end
Chair of Software Engineering OOSC Summer Semester The need for deferred classes In the scheme seen earlier: f: FIGURE; c: CIRCLE; p: POLYGON... create c.make (...); create p.make (...)... if... then f := c else f := p end... f.move (...); f.rotate (...); f.display (...);... How do we ensure that a call such as f.move (...) is valid even though there is no way to implement a general-purpose feature move for class FIGURE?
Chair of Software Engineering OOSC Summer Semester Deferred classes deferred class FIGURE feature move (v: VECTOR) is deferred end rotate (a: ANGLE; p: POINT) is deferred end... display, hide,... end Not permitted: create f...
Chair of Software Engineering OOSC Summer Semester Example hierarchy FIGURE * OPEN_ FIGURE * CLOSED_ FIGURE * SEGMENTPOLYLINEPOLYGONELLIPSE CIRCLE RECTANGLETRIANGLE SQUARE extent* barycenter* … display* rotate* … perimeter* perimeter+ perimeter++ diagonal... perimeter++
Chair of Software Engineering OOSC Summer Semester Deferred classes and features A feature is either deferred or effective. To effect a inherited feature (deferred in the parent) is to make it effective. No need for redefine clause. Like a feature, a class is either deferred or effective. A class is deferred if it has at least one deferred feature (possibly coming from an ancestor) that it does not effect. It is effective otherwise. A deferred class may not be instantiated. BUT: A deferred class may have assertions (in particular, a deferred routine may have a precondition and a postcondition, and the class may have a class invariant).
Chair of Software Engineering OOSC Summer Semester Deferred classes Compare with Ada-Modula 2-Java interface/body separation: May contain both deferred and non-deferred elements. More than one implementation is possible. Formal semantic specification (assertions).
Chair of Software Engineering OOSC Summer Semester Table variants TABLE * SEQUENTIAL_ TABLE * LINKED_ TABLE + ARRAY_ TABLE + FILE_ TABLE +
Chair of Software Engineering OOSC Summer Semester Don’t call us, we’ll call you deferred class SEQUENTIAL_TABLE [G] inherit TABLE [G] feature has (x: G): BOOLEAN is -- Does x appear in table? do from start until after or else equal (item, x) loop forth end Result := not after end
Chair of Software Engineering OOSC Summer Semester SEQUENTIAL_TABLE (cont’d) forth is -- Move cursor to the next position. require not after deferred ensure position = old position + 1 end start is -- Move cursor to the first position. deferred ensure empty or else position = 1 end
Chair of Software Engineering OOSC Summer Semester SEQUENTIAL_TABLE (end) position: INTEGER is deferred end... empty, found, after,... invariant 0 <= position position <= size + 1 empty implies (after or before) end
Chair of Software Engineering OOSC Summer Semester Descendant implementations TABLE * SEQUENTIAL_ TABLE * LINKED_ TABLE + ARRAY_ TABLE + FILE_ TABLE + has+ forth* item* start* forth+ item+ start+ after+ forth+ item+ start+ after+ forth+ item+ start+ after+ after* has*
Chair of Software Engineering OOSC Summer Semester Descendant implementations (cont’d) SEQUENTIAL_ TABLE * LINKED_ TABLE + ARRAY_ TABLE + FILE_ TABLE + has+ forth* item* start* forth+ item+ start+ after+ forth+ item+ start+ after+ forth+ item+ start+ after+ after*
Chair of Software Engineering OOSC Summer Semester Implementation variants Array Linked list File startforthafteritem (x) c := first_cell rewind i := 1 c := c.right i := i + 1 readend_of_file c := Void f c.item i > countt [i]
Chair of Software Engineering OOSC Summer Semester End of lecture 8