1 / 39

Föreläsning 8, kapitel 8

Föreläsning 8, kapitel 8. Förbättra strukturen med arv Kursbok: “Objects First with Java - A Practical Introduction using BlueJ”, David J. Barnes & Michael Kölling. Fredric Ragnar fredric.ragnar@hgo.se Telefon 0498-299948 Andreas Hedrén andreas.hedren@hgo.se Telefon 0498-299954.

cherie
Download Presentation

Föreläsning 8, kapitel 8

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. Föreläsning 8, kapitel 8 Förbättra strukturen med arvKursbok: “Objects First with Java- A Practical Introduction using BlueJ”, David J. Barnes & Michael Kölling Fredric Ragnar fredric.ragnar@hgo.se Telefon 0498-299948 Andreas Hedrén andreas.hedren@hgo.se Telefon 0498-299954

  2. Dagens punkter • Arv • Subtyping • Substitution • Polymorfa variabler

  3. DoME exemplet "Database of Multimedia Entertainment" • Lagrar detaljer om CD-skivor och videofilmer • CD: titel, artist, antal spår, speltid, har den, kommentar • Video: titel, regissör, speltid, har den, kommentar • Tillåter (senare) att söka efter information eller skriva ut listor

  4. Objekt i DoME

  5. Klasser i DoME

  6. Objektmodell för DoME

  7. Klassdiagram för DoME

  8. public class CD { private String title; private String artist; private String comment; CD(String theTitle, String theArtist) { title = theTitle; artist = theArtist; comment = " "; } void setComment(String newComment) { ... } String getComment() { ... } void print() { ... } ... } Källkod för klassen CD Inte komplett (kommentarer!)

  9. public class Video { private String title; private String director; private String comment; Video(String theTitle, String theDirect) { title = theTitle; director = theDirect; comment = " "; } void setComment(String newComment) { ... } String getComment() { ... } void print() { ... } ... } Källkod för klassen Video Inte komplett (kommentarer!)

  10. class Database { private ArrayList cds; private ArrayList videos; ... public void list() { for(Iterator iter = cds.iterator(); iter.hasNext(); ) { CD cd = (CD)iter.next(); cd.print(); System.out.println(); // empty line between items } for(Iterator iter = videos.iterator(); iter.hasNext(); ) { Video video = (Video)iter.next(); video.print(); System.out.println(); // empty line between items } } } Källkod för klassen Database

  11. Kritik av DoME • Duplicering av kod • Klasserna CD och Video är väldigt lika, stora delar t o m identiska • Gör underhåll svårt/mer jobb • Inför risk för buggar genom felaktigt underhåll • Det finns också duplicerad kod i klassen Database

  12. Använda arv

  13. Använda arv, mer • Definiera en superklass: Item • Definiera subklasser för Video och CD • Superklassen definierar gemensamma attribut • Subklasserna ärver superklassens attribut • Subklasserna lägger till egna attribut

  14. Arvshierarkier

  15. Arv i Java Ingen ändring här public class Item { ... } Ändra här public class Video extends Item { ... } public class CD extends Item { ... }

  16. Superklassen Item public class Item { private String title; private int playingTime; private boolean gotIt; private String comment; // constructors and methods omitted. }

  17. Underklasserna CD och Video public class CD extends Item { private String artist; private int numberOfTracks; // constructors and methods omitted. } public class Video extends Item { private String director; // constructors and methods omitted. }

  18. public class Item { private String title; private int playingTime; private boolean gotIt; private String comment; /** * Initialise the fields of the item. */ public Item(String theTitle, int time) { title = theTitle; playingTime = time; gotIt = false; comment = ""; } // methods omitted } Arv och konstruktorer

  19. public class CD extends Item { private String artist; private int numberOfTracks; /** * Constructor for objects of class CD */ public CD(String theTitle, StringtheArtist, int tracks, int time) { super(theTitle, time); artist = theArtist; numberOfTracks = tracks; } // methods omitted } Arv och konstruktorer, mer

  20. Anrop av superklassens konstruktor • Subklassernas konstruktorer måste alltid ha ett ”super” anrop • Om det inte finns i källkoden så lägger kompilatorn till ett ”super”-anrop (utan parametrar) • Funkar bara om superklassen har en konstruktor utan parametrar • Måste vara den första satsen i subklassens konstruktor

  21. Lägger till flera Item typer

  22. Djupare hierarkier

  23. Summering Vitsen med arv vad vi hittills sett: • Att undvika duplicering av kod • Återanvändning av kod • Lättare underhåll • Möjlighet att utöka

  24. Ny källkod för klassen Database public class Database { private ArrayList items; /** * Construct an empty Database. */ public Database() { items = new ArrayList(); } /** * Add an item to the database. */ public void addItem(Item theItem) { items.add(theItem); } ... } undviker duplicering av kod i klienten!

  25. /** * Print a list of all currently stored CDs and * videos to the text terminal. */ public void list() { for(Iterator iter = items.iterator(); iter.hasNext(); ) { Item item = (Item)iter.next(); item.print(); System.out.println(); // empty line between items } } Ny källkod för klassen Database

  26. Subtypning Först hade vi: public void addCD(CD theCD) public void addVideo(Video theVideo) Nu har vi: public void addItem(Item theItem) Vi anropar den här metoden med: Video myVideo = new Video(...); database.addItem(myVideo);

  27. Subklasser och subtypning • Klasser definierar typer • Subklasser definierar subtyper • Objekt av subklasser kan användas där objekt av superklasser krävs (Detta kallas substitution)

  28. Subtypning och tilldelning Objekt ur en subklass kan tilldelas till superklass variabler Vehicle v1 = new Vehicle(); Vehicle v2 = new Car(); Vehicle v3 = new Bicycle();

  29. Subtypning och parametrar public class Database { public void addItem(Item theItem) { ... } } Video video = new Video(...); CD cd = new CD(...); database.addItem(video); database.addItem(cd); Objekt ur en subklass kan användas som parametrar som är objekt ur en superklass

  30. Objektdiagram

  31. Klassdiagram

  32. Polymorfa variabler • Objektvariabler i Java är polymorfaDe kan innehålla objekt av mer än en typ • De kan innehålla objekt av den deklarerade typen, eller objekt av subtyper av den deklarerade typen.

  33. Klassen Object Alla klasser ärver från Object.

  34. Polymorfa samlingar • Alla samlingar (collections) är polymorfa • Elementen är av typen Object public void add(Object element) public Object get(int index)

  35. Casting, igen • Kan tilldela subtyp till supertyp • Kan inte tilldela supertyp till subtyp String s1 = myList.get(1);fel! • Casting fixar detta: String s1 = (String) myList.get(1); Bara om elementet verkligen är en String.

  36. Wrapper-klasser • Alla objekt kan stoppas in i en samling… • …eftersom samlingar klarar element av typen Object… • … och alla klasser är subtyper till Object • Great! Men primitiva typer då?

  37. Wrapper-klasser, mer • Primitiva typer (int, char, etc) är inte objekt. De måste ”slås in”/”wrappas” i ett objekt. • Wrapper-klasser finns för alla primitiva typer primitiv typ wrapper-klass int Integer float Float char Character ... ...

  38. Wrapper-klasser, ännu mer packa int-värdet I ett objekt int i = 18; Integer iwrap = new Integer(i); myCollecton.add(iwrap); ... Integer element = (Integer) myCollection.get(0); int value = element.intValue() Lägg till objektet Plocka ut värdet igen

  39. Summering • Arv tillåter att klasser definieras som utökningar av andra klasser • Arv: • Undviker duplicering av kod • Tillåter återanvändning av kod • Förenklar koden • Förenklar underhåll och tillägg • Variabler kan referera till objekt av subtyper • Subtyper kan användas överallt där objekt av superklassen förväntas (substitution)

More Related