1 / 22

Introduction to Programming

This exercise session focuses on inheritance, deferred classes, redefinition, renaming, the Observer pattern, and genericity in programming. It also explores the relation of Lego bricks and their features.

cevelyn
Download Presentation

Introduction to Programming

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 1 Introduction to Programming Bertrand Meyer Exercise Session 13 10. November 2008

  2. This week Inheritance: Deferred classes & features Redefinition, renaming Observer Pattern Genericity Hint for Assignment

  3. Let's play Lego! Inheritance Relation of Lego bricks BRICK LEGO_BRICK LEGO_BRICK_WITH_HOLE LEGO_BRICK_SLANTED

  4. class BRICK deferred class BRICK feature-- Access width: INTEGER depth: INTEGER height: INTEGER color: COLOR volume: INTEGER deferred end end

  5. Class LEGO_BRICK class LEGO_BRICK inherit BRICK feature-- Access number_of_nubs: INTEGER do Result:= ... end volume: INTEGER do Result := ... end end Inherit all features of class BRICK New feature, calculate all nubs Implementation of `volume'

  6. Class LEGO_BRICK_SLANTED class LEGO_BRICK_SLANTED inherit LEGO_BRICK redefine volume end feature -- Access volume: INTEGER do Result:= ... end end Feature `volume' is going to be redefined (=changed). `volume' comes from LEGO_BRICK

  7. Class LEGO_BRICK_WITH_HOLE class LEGO_BRICK_WITH_HOLE inherit LEGO_BRICK redefine volume end feature -- Access volume: INTEGER do Result:= ... end end Feature `volume' is going to be redefined (=changed). `volume' comes from LEGO_BRICK

  8. Notation Notation: Deferred * Effective + Redefinition ++ * volume* BRICK + volume+ LEGO_BRICK volume++ volume++ + + LEGO_BRICK_WITH_HOLE LEGO_BRICK_SLANTED

  9. Deferred & effective Deferred Deferred classes can possess deferred features A class with at least one deferred feature must be declared as deferred A deferred feature does not have an implementation yet Attributes can't be deferred (because they don't need a feature body anyways)‏ Deferred classes cannot be instantiated and hence cannot contain a createclause Effective Effective classes do not possess deferred features (the “standard case”)‏ Effective features have an implementation of their feature body (“do .. end”)

  10. Precursor If a feature was redefined, but you still wish to call the old one, use the precursor keyword volume: INTEGER do Result:= Precursor - ... end

  11. Types in the source code Expressions have a static type For attributes and functions it is denoted after the declaration ':' name: STRING list: LINKED_LIST [INTEGER] A class is the static part of a program, which contains only static types

  12. Type of an object The type of an object is set upon creation local lego: LEGO_BRICK brick: BRICK create {LEGO_BRICK} brick-- explicit -- same as -- create lego; brick := lego createlego-- implicit Objects belong to the dynamic part of a program ->dynamic types

  13. Dynamic types local a_bag: SOME_BAG do create {MONEY_BAG} a_bag.put (10)‏ What is the static type of `a_bag'? What's the dynamic type of the object denoted by `a_bag'? Hands-On SOME_BAG MONEY_BAG

  14. The Observer Pattern * * PUBLISHER OBSERVER update* subscribe subscribed attach detach trigger GUI_CLASS APP_CLASS update+ * Deferred (abstract)‏ Inherits from + Effective (implemented)‏ Client (uses)‏

  15. Observer pattern Publisher keeps a list of observers: subscribed: LINKED_LIST [OBSERVER] To register itself, an observer may execute subscribe (some_publisher)‏ where subscribe is defined in OBSERVER: subscribe (p: PUBLISHER)‏ -- Make current object observep. require publisher_exists: p /= Void dop.attach (Current)‏ end

  16. Attaching an observer In class PUBLISHER: attach (s: OBSERVER)‏ -- Registersas subscriber to current publisher. requiresubscriber_exists: s /= Voiddosubscribed.extend (s)‏ end The invariant of PUBLISHER includes the clause subscribed /= Void (List subscribed is created by creation procedures of PUBLISHER)‏

  17. Triggering an event trigger -- Ask all observers to -- react to current event. dofromsubscribed.startuntilsubscribed.afterloopsubscribed.item. subscribed.forthendend Each descendant of OBSERVER defines its own versionof update * * update* PUBLISHER OBSERVER attach detach GUI_CLASS APP_CLASS update+ update

  18. Changing the implementation of the pattern How would the implementation of the Observer pattern change if: each observer subscribes not itself, but one of its routines to the publisher when the event occurs, the publisher must call these subscribed routines with information about the event Hands-On

  19. Exercise: a news agency Consider you must create an application which allows a news agency to dispatch news to various papers, radio and TV stations, etc. How would you design and implement this application? Hands-On

  20. Genericity But what if a certain box should only contain Lego bricks, i.e. all kinds of them (slanted, 2x4, etc.)? class BOX [G] feature wipe_out is ... put (v: G) is ... end

  21. For Assignment 7 21 • Vector Geometry

  22. End exercise session 15

More Related