TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 3

Relevanta dokument
TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 2

Övning 4. I denna övning ska vi titta på icke-muterbarhet kontra muterbarhet, samt metoderna equals, hashcode och clone.

Övning vecka 4. Denna vecka ska vi titta på icke-muterbarhet kontra muterbarhet, samt metoderna equals, hashcode och clone.

TDA550 - Objektorienterad programvaruutveckling, fk

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 1

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 4

Instuderingsuppgifter läsvecka 2

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 2

TENTAMEN OOP

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 5

Tentamen Programmering fortsättningskurs DIT950

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 5

Föreläsning 13 Innehåll

Subklasser och arv Inledning till grafik (JFrame och JPanel). Något om interface. Objektorienterad programvaruutveckling GU (DIT011) Subklasser

Lösningsförslag till omtentamen för TDA540 Objektorienterad Programmering

Objektorienterad programmering (OOP) Föreläsning 15 & 16. Klasser för olika slags fordon. Klasser och objekt

Objektorienterad programutveckling, fk

Repetition av viktiga begrepp inom objektorienterad programmering

Tentamen LÖSNINGSFÖRSLAG. c) Tilldelningen C x = new D() ger kompileringsfel eftersom klassen D är abstrakt.

1 Repetition av viktiga begrepp inom objektorienterad programmering

2I1049 Föreläsning 5. Objektorientering. Objektorientering. Klasserna ordnas i en hierarki som motsvarar deras inbördes ordning

Konstruktion av klasser med klasser

TDDE10 TDDE11, 725G90. Objektorienterad programmering i Java, Föreläsning 3 Erik Nilsson, Institutionen för Datavetenskap, LiU

1 Comparator & Comparable

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Svaret kan ges i Javakod (eller i UML-klassdiagram). public class A { B minb;... } public class B { <B:s många variabler och metoder> } Lösning:

TDDD78 Viktiga begrepp, del 2

DAT043 Objektorienterad programmering för D, DIT011 Objektorienterad programvaruutveckling för GU

Klasshierarkier. Klasser kan byggas på redan definierade klasser

Övning 5. TDA550 - Objektorienterad programvaruutveckling, fk

Att skriva till och läsa från terminalfönstret

Idag. Exempel, version 2. Exempel, version 3. Ett lite större exempel

Exempel på listor (klassen ArrayList). Ett exempel med fält. Avbildning är en speciell typ av lista HashMap.

Klasshierarkier - repetition

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Erik Nilsson, Institutionen för Datavetenskap, LiU

TENTAMEN: Objektorienterad programmering. Läs detta! Skriv din tentamenskod på varje blad (så att vi inte slarvar bort dem).

Tentamen. 2D4135 vt 2005 Objektorienterad programmering, design och analys med Java Lördagen den 28 maj 2005 kl

Vad handlar kursen om? Algoritmer och datastrukturer. Vad handlar kursen om? Vad handlar kursen om?

Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Tentamen Programmeringsteknik II Skrivtid: Hjälpmedel: Java-bok (vilken som helst) Skriv läsligt! Använd inte rödpenna!

Övning vecka 6. public void method2() { //code block C method3(); //code block D }//method2

Lösningsförslag till tentamen för TDA540 Objektorienterad Programmering

Lösningsförslag till tentamen

Static vs Dynamic binding Polymorfism. Objekt-orienterad programmering och design (DIT953) Niklas Broberg, 2018

OMTENTAMEN I PROGRAMSPRÅK -- DVG C kl. 08:15-13: 15

UML. Klassdiagr. Abstraktion. Relationer. Överskugg. Överlagr. Aktivitetsdiagram Typomv. Typomv. Klassdiagr. Abstraktion. Relationer.

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 3

Static vs Dynamic binding Polymorfism. Objekt-orienterad programmering och design Alex Gerdes, 2016

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Tentamen, EDA501/EDAA20 Programmering M MD W BK L

Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

TENTAMEN OOP

Objektorienterad programmering i Java

Examination i. PROGRAMMERINGSTEKNIK F1/TM1 TIN212 (Dugga) Dag: Onsdag Datum: Tid: (OBS 3 tim) Rum: V

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

OOP Objekt-orienterad programmering

Arv (Inheritance) Multipelt arv finns i verkligheten. Överskuggning, metodbindning. Läsanvisning: ! Arv! Object, instanceof! Relationer!

Föreläsning 9: Arv och UML

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

Föreläsning 8: Exempel och problemlösning

2203$( Föreläsning ii - Mer om Java bla this och konstruktorer. Exempel: lampa

TENTAMEN: Objektorienterad programutveckling, fk. Läs detta! Uppgifterna är inte ordnade efter svårighetsgrad.

Föreläsning 5&6 LOGISKA VARIABLER; IMPLEMENTERA KLASSER; MER ALGORITMER

Föreläsning 12: Exempel och problemlösning

Modelsvar för Tentamen för Objektorienterad programvaruutveckling, TDA545

Lösningsförslag till tentamen

OOP Objekt-orienterad programmering

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 2 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Målen med OOSU. Objektorienterad programmering. Objektorienterad programmering. Karlstads Universitet, Johan Öfverberg 1

Objektorienterad programvaruutveckling, fk, TDA550. Exempeltentamen

Objekt-orientering. Java är ett objekt-orienterat programmeringsspråk

Tentamen för TTIT71 Programmering kl Institutionen för datavetenskap Linköpings universitet. Uppgift 1. (2 p)

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Polymorfi. Objektorienterad och komponentbaserad programmering

Del A (obligatorisk för alla)

Lösningsförslag till tentamen

Abstrakt klass. DD2385 Programutvecklingsteknik Några bilder till föreläsning 4 31/ Exempel: Implementation av Schackpjäser.

Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

Outline. Objektorienterad Programmering (TDDC77) Åsidosättning. Signatur. Åsidosättning. Abstrakta klasser. Ahmed Rezine.

Ett problem. Kontrollstrukturer och arrayer. Arrayer. Lösningen. Arrayer och hakparanteser. Exempel int[] results; results = new int[10]; // 0..

Högskolan Dalarna sid 1 av 7 DI-institutionen Hans-Edy Mårtensson Sten Sundin

OBJEKTORIENTERAD PROGRAMVARUUTVECKLING. Övningstentamen 1

Överlagring, static, testning, formella metoder och undantag! Förelasning 13!! TDA540 Objektorienterad Programmering!

TENTAMEN I PROGRAMMERING. På tentamen ges graderade betyg:. 3:a 24 poäng, 4:a 36 poäng och 5:a 48 poäng

SI-pass 4. Johan Brook och Jesper Persson. 25 september Diskutera och svara på om påståendena nedan är äkta sanningar eller listiga lögner.

Variabler som hör till enskilda objekt. Deklareras på översta nivån i klassen och i regel som private.

Exempel på användning av arv: Geometriska figurer

/* * * Lösningsförslag tentamen DIT950 * Datum * */ /* * -1 - */ För samtliga gäller,se föreläsningsanteckningar.

Grundläggande programmering, STS 1, VT Sven Sandberg. Föreläsning 14

Seminarium 3 Introduktion till Java Collections Framework Innehåll. Generik Bakgrund. Exempel på en generisk klass java.util.arraylist.

Outline. Objektorienterad Programmering (TDDC77) Signatur. Klassen calculator. Överlagring (overloading) Arv (inheritance) Ahmed Rezine

Lösningsförslag till tentamen

DIAGNOSTISKT PROV. Tid. Hjälpmedel. Antaganden. Rättning. Övrigt. Diagnostiskt Prov. Klockan Inga

DAT043 Objektorienterad Programmering

Tentamen. DD2385 Programutvecklingsteknik vt 2014 Måndagen den 2 juni 2014 kl Hjälpmedel: penna, suddgummi, linjal

Repetition av OOP- och Javabegrepp

Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser

Lösningsförslag övning 2.

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

Transkript:

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 3 Pelle Evensen, Daniel Wetterbro 16 oktober 2012 Sammanfattning Denna vecka ska vi titta på polymorfism, dynamisk kontra statisk bindning, implementationsarv, equals samt (mycket) lite om klassinvarianter. Övningarna är graderade (något subjektivt) från lätt ( ) till svår ( ). Svårighetsgraden hos en övning har inte nödvändigtvis med lösningens storlek att göra. 1 Liskovs substitutionsprincip (LSP) LSP säger att alla objekt av en subtyp U ska kunna fungera som substitut för objekt av vilken som helst av U:s supertyper. 1.1 Specialisering eller generalisering I? I fig. 1 ges källkoden för klasserna IntegerClass och ObjectClass. Då vi ser att de är så gott som identiska, hade vi kunnat låta den ena vara en subklass till den andra? Om så är fallet, spelar det någon roll om det är IntegerClass som är subklass till ObjectClass eller tvärtom? class IntegerClass { public static Integer square(int x) { return new Integer(x * x); class ObjectClass { public static Object square(int x) { return new Integer(x * x); Figur 1: Klasserna IntegerClass och ObjectClass. 1

1.2 Specialisering eller generalisering II? I fig. 2 ges källkoden för klasserna SuperClass och SubClass. När vi använder klassen SubClass vill vi inte att man ska kunna komma åt värdet direkt utan bara dess kvadrat. Detta har vi försökt åstadkomma genom att deklarera metoden getvalue i SubClass private. Varför går det inte att kompilera klassen SubClass? class SuperClass { private final int value; public SuperClass(int value) { this.value = value; public int getvalue() { return value; class SubClass extends SuperClass { public SubClass(int x) { super(x); private int getvalue() { return super.getvalue(); public int getsquare() { return getvalue() * getvalue(); Figur 2: Klasserna SuperClass och SubClass. 2

2 Polymorfism och dynamisk typ 2.1 Dynamisk kontra statisk bindning I Klassen Binding1 (fig. 4) innehåller metoder för utskrift av olika typer av objekt. Alla klasser i Java är subklasser till klassen Object som innehåller metoden tostring(). Metoden printvalue är överlagrad och skiljer sig bara med avseende på typen hos den formella parametern. Metoden tostring är däremot överskuggad. Givet definitionerna för klasserna A, B och S (fig. 3), vad kommer utskriften att bli när vi kör Binding1.main? Vilka metoder i vilka klasser kommer att exekveras vid körningen av Binding1.main och framförallt; varför anropas just de metoderna? class S { public String tostring() { return "I am an S!"; class A extends S { public String tostring() { return "I am an A!"; class B extends A { public String tostring() { return "I am a B!"; Figur 3: Klasserna A, B och S. 2.2 Dynamisk kontra statisk bindning II Studera klassen Binding2 (fig. 5). Antag att klasserna A, B och S är som tidigare givna i fig. 3. Vad blir utskriften när Binding2.main körs? Varför? 3

public class Binding1 { public static void printvalue(a v) { System.out.println("This was an A: " + v.tostring()); public static void printvalue(b v) { System.out.println("This was a B: " + v.tostring()); public static void printvalue(s v) { System.out.print("That was an S"); if (v.getclass()!= S.class) { System.out.print(", subclassed by " + v.getclass() + ": "); else { System.out.print(", not a strict subclass of S." + ": "); System.out.println(v.toString()); public static void main(string[ ] args) { S spa = new S(); A apa = new A(); B bepa = new B(); S apalt = apa; A bepalt = bepa; printvalue(spa); printvalue(apa); printvalue(bepa); printvalue(apalt); printvalue(bepalt); Figur 4: Klassen Binding1. public class Binding2 { public static void main(string[ ] args) { S[ ] objs1 = new S[ ] { new A(), new B(), new S() ; for (S o : objs1) { Binding1.printValue(o); A[ ] objs2 = new A[ ] { new A(), new B() ; for (S o : objs2) { Binding1.printValue(o); for (A o : objs2) { Binding1.printValue(o); Figur 5: Klassen Binding2. 4

3 Klassinvarianter & aliasing Klassen Period representerar ett datumintervall genom att innehålla ett startdatum och ett slutdatum. I kommentarerna till klassen visas dessutom vilket kontrakt implementationen av klassen måste uppfylla ( Programming by Contract ). En invariant är ett villkor som alltid måste vara uppfyllt, ett precondition utgör krav som måste vara uppfyllda innan en metod anropas och postcondition visar samband som gäller efter att metoden körts. Några klassinvarianter för Period (vilka?) medför att klassen är icke-muterbar. Att klassen är icke-muterbar innebär att när ett objekt av klassen väl instantierats så kommer det under resten av sin livslängd ha samma värden som då det skapades. Har programmeraren gjort sitt jobb eller finns det sätt att bryta mot klassens invarianter? Om så är fallet, hur kan vi åtgärda felen? /** * @invariant getstart() is before or at the same time as getend() * @invariant getstart() consistently returns the same value after object creation * @invariant getend() consistently returns the same value after object creation */ public final class Period { private final Date start; private final Date end; /** * @param start the beginning of the period * @param end the end of the period; must not precede start * @pre start <= end * @post The time span of the returned period is positive. * @throws IllegalArgumentException if start is after end * @throws NullPointerException if start or end is null */ public Period(Date start, Date end) { if (start.compareto(end) > 0) { throw new IllegalArgumentException(start + " after " + end); this.start = start; this.end = end; public Date getstart() { return start; public Date getend() { return end; Figur 6: Klassen Period. 5

4 Likhet (equals) För metoden equals förväntar vi oss typiskt att dessa egenskaper håller; Reflexivitet: a.equals(a) Symmetri: a.equals(b) = b.equals(a) Transitivitet: a.equals(b) b.equals(c) = a.equals(c) 4.1 Relationsdrama 1 I Betrakta klassen CaseInsensitiveString (fig. 8). Finns det några omständigheter under vilka de tre önskvärda relationerna inte gäller för klassen? Vad händer om man jämför med en MyString? Med en CaseInsensitiveString? Spelar ordningen någon roll? Om det finns något problem, vad borde man gjort istället? public class MyString { private final String s; public final class CaseInsensitiveString extends MyString { public MyString(String s) { if (s == null) { throw new NullPointerException(); this.s = s; if (o instanceof MyString) { MyString os = (MyString) o; return s.equals(os.s); public String asstring() { return s; public CaseInsensitiveString(String s) { super(s); if (o instanceof MyString) { MyString os = (MyString) o; if (os instanceof CaseInsensitiveString) { return asstring().equalsignorecase(os.asstring()); return super.equals(o); Figur 7: MyString. Figur 8: CaseInsensitiveString. 1 Lånad från [Blo08] 6

4.2 Relationsdrama II Betrakta klasserna Point (fig. 9) och NamedPoint (fig. 10). Håller relationerna beskrivna i sektion 4 för dessa två klasser? Om inte, vilken eller vilka relationer håller inte? Om någon av relationerna inte håller, hur borde man implementerat equals istället? public class Point { private final int x; private final int y; public Point(int x, int y) { this.x = x; this.y = y; public class NamedPoint extends Point { private final String name; public NamedPoint(int x, int y, String name) { super(x, y); this.name = name; if (!(o instanceof Point)) { else { Point p = (Point) o; return p.x == x && p.y == y; Figur 9: Klassen Point. if (!(o instanceof Point)) { // If o is a normal Point, do // a name-blind comparison if (!(o instanceof NamedPoint)) { return o.equals(this); // o is a NamedPoint; do // a full comparison return super.equals(o) && ((NamedPoint) o).name == name; Figur 10: Klassen NamedPoint. Referenser [Blo08] Joshua Bloch. Effective Java. Addison-Wesley, 2nd edition, 2008. 7