Konstruktion av klasser med klasser

Relevanta dokument
Konstruktion av klasser med klasser

Aggregering. Arv och klasshierarkier. Arv. Arv (forts)

Klasshierarkier. Klasser kan byggas på redan definierade klasser

Klasshierarkier - repetition

Exempel på användning av arv: Geometriska figurer

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

Föreläsning 13 Innehåll

public och private Obs: private inte skyddar mot access från andra objekt i samma klass.

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

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

Föreläsning 8. Arv. Arv (forts) Arv och abstrakta klasser

Dagens föreläsning. Arrayer och klasser. Medan ni väntar: Gå till m.voto.se/prog11 och svara på några gamla tentamensfrågor! (26 januari 2018 F3 1 )

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

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

OOP Objekt-orienterad programmering

Kungliga Tekniska Högskolan Ämneskod 2D4134 Nada Tentamensdag maj - 19 Tentamen i Objektorientering och Java Skrivtid 5 h

Programmeringsteknik II - HT18. Föreläsning 6: Grafik och händelsestyrda program med användargränssnitt (och Java-interface) Johan Öfverstedt

Arv och polymorfi. Lite terminologi; Basklass eller superklass: En klass som fungerar som bas för vårt arv. Vi skapar nya klasser utifrån den.

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

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

Interface. Interface. Tobias Wrigstad (baserat på bilder från Tom Smedsaas) 3 december 2010

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

Frivillig Java-swing-Graphics-lab Programmeringsteknik MN1 vt02

OOP Objekt-orienterad programmering

Inkapsling tumregler. Åtkomstmodifikatorer, instantiering, referenser, identitet och ekvivalens, samt klassvariabler. public och private

Detta dokument är ett exempel, cirka andra hälften av en tentamen för TDA545 Objektorienterad programvaruutveckling

Två designmönster, MVC och Observer/Observable. Objektorienterad programvaruutveckling GU (DIT011)

Arv: Fordonsexempel. Arv. Arv: fordonsexempel (forts) Arv: Ett exempel. En klassdefinition class A extends B {... }

Lösningar till Fiktiv Tentamen på kursen. 2D4135 Objektorienterad programmering, design och analys med Java vt2004. Teoridel

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

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

PROGRAMMERINGSTEKNIK TIN212

Kap J 7-1 Mer om arv. (superklass) (subklass)

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

Arv. Fundamental objekt-orienterad teknik. arv i Java modifieraren protected Lägga till och modifiera metoder med hjälp av arv Klass hierarkier

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

Begreppet subtyp/supertyp i Java. Mera om generik. Generik och arv. Generik och arv. Innehåll

Kort om klasser och objekt En introduktion till GUI-programmering i Java

OOP Tenta

Objektorientering. Objekt och metoder. Objektorientering. Viktiga begrepp. Klass. Objekt. Deklarativ programmering

Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren om att du har förstått dessa även om detaljer kan vara felaktiga.

1 Uppgift 1. a) Skapar ett Company-objekt med hjälp av den överlagrade konstruktorn. Du kan själv välja värden på instansvariablerna.

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

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

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

Objektorienterad Programkonstruktion. Föreläsning 2 2 nov 2016

Föreläsning 5-6 Innehåll

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

Lösningar till tentamen i EDAF25

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

Objektorienterad programmering i Java

Designmönster. Kapitel Kommandomönstret

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.

"Är en"-relation. "Har en"-relation. Arv. Seminarium 2 Relevanta uppgifter. I exemplet Boll från förra föreläsningen gällde

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

Idag. statiska metoder och variabler. private/public/protected. final, abstrakta klasser, gränssnitt, delegering. wrapper classes

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

TENTAMEN OOP

TENTAMEN PROGRAMMERING I JAVA, 5P SOMMARUNIVERSITETET

Programmering i C++ EDA623 Arv. EDA623 (Föreläsning 6) HT / 42

Föreläsningsmaterial (Arv) Skrivet av Andreas Lund

Presentation av trafiksimuleringsprojektet

Repetition av viktiga begrepp inom objektorienterad programmering

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

Arv. Objektorienterad och komponentbaserad programmering

Objektorienterad Programmering (TDDC77)

Föreläsning 4. Klass. Klassdeklaration. Klasser Och Objekt

Rekursion. Att tänka rekursivt Att programmera rekursivt i Java Exempel. Programmeringsmetodik -Java 254

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

1 Repetition av viktiga begrepp inom objektorienterad programmering

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

Föreläsning 12. Föreläsning 12. Rörliga figurer Klassen Timer Undantag Något om applets. Rörliga appletsfigurer Klassen Timer Undantag

DD2310. Javaprogrammering för Pythonprogrammerare. Johan Boye

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

Kungliga Tekniska Högskolan Ämneskod 2D4134 Nada Tentamensdag aug - 23 Tentamen i Objektorientering och Java Skrivtid 5 h

public interface Skrivbar { void skriv(); } public class Punkt implements Skrivbar { public double x; public double y;

DAT043 - föreläsning 8

DI-institutionen Sid 1 av 6 Hans-Edy Mårtensson Sten Sundin

UML. Översikt UML. Relationer mellan klasser. A är ett aggregerat av B:n. Kontor aggregat av Enheter. 12 olika diagramtyper, bl.a.

ID1004 Laboration 3, 5-6 November 2012

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

Innehåll. dynamisk bindning. och programmering CRC) u Arv, polymorfi och

TENTAMEN OOP

UML. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Föreläsning 14: Grafik & mera händelsehantering

Tentamen Programmeringsteknik II för STS Skrivtid: Inga hjälpmedel.

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-17, TDA540. Dag: , Tid:

lgammal2.txt // Lösningar till gammal tentamen // Uppgift 1 a

Tentamen i Objektorienterad modellering och design

PROG2 Tenta Gäller SP:PROG2, DSK2:PROG2, FK:PROG2, FK:OOP, DSV1:P2 och ITK:P2

DAT043 - Föreläsning 7

LÖSNINGSFÖRSLAG TILL TENTAMEN PROGRAMMERINGSMETODIK MOM2 - JAVA, 4P.

Grafiska komponenter.

OOMPA 2D1359 Föreläsning 8

Outline. Objektorienterad Programmering (TDDC77) Att instansiera en klass. Objekt. Instansiering. Åtkomst. Abstrakt datatyp.

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

Lösningsförslag till exempeltenta 2

Laboration 1 - Grunderna för OOP i Java

Transkript:

Konstruktion av klasser med klasser Klasser kan byggas på redan denierade klasser genom att klassobjekt används som dataattribut när en ny klass beskrivs. Exempel: I En klass PairOfDice kan konstrueras med två attribut av typen Die. I En klass CardDeck kan byggas med hjälp av ett arrayobjekt innehållande 52 objekt av typen Card I En klass ListMap kan konstrueras med hjälp av ListNode-objekt I En klass TrafficSystem kan sättas ihop med objekt ur klasser som Lane, Light, Vehicle... Man brukar säga att detta är en består av -relation (16 november 2009 Klasshierarkier 1 )

Klasshierarkier En ny klass kan också byggas som en specialisering av en bentlig klass. Exempel: I Klassen StackException som används i Stack-klassen är skriven som en subklass till Exception I Om vi har en klass Fordon så kan vi bygga nya klasser som t.ex. Spark, Cykel och Bil. En Bil kan i sin tur vara basklass för klasserna Personbil och Lastbil Fordon Spark Cykel Bil Personbil Lastbil (16 november 2009 Klasshierarkier 2 )

I dessa fall säger man att man har en klasshierarki I Klassen Fordon sägs vara en basklass I Klasserna Spark, Cykel och Bil är subklasser eller underklasser till klassen Fordon I En subklass (t ex klassen Bil) kan användas som basklass för andra klasser (t ex Personbil och Lastbil) Man brukar säga att frasen är en... som... kan användas för att identiera att det är lämpligt att använda sig av en klasshierarki. (16 november 2009 Klasshierarkier 3 )

Arv Ett objekt ur en subklass I har alla basklassens attribut och metoder och I kan lägga till egna Man säger att subklassen ärver basklassens egenskaper. Exempel: Klassen Bil kan ha egenskapen vikt. En Personbil kan tillfoga pantal medan en Lastbil kan tillfoga maxlast. En subklass kan också skriva över basklassens metoder. (16 november 2009 Klasshierarkier 4 )

(16 november 2009 Klasshierarkier 5 ) Unied Modeling Language (UML) Klasshierarkier uttrycks ofta i klassdiagram i UML. Fordon print() : void Spark Cykel print() : void Bil vikt : double print() : void Personbil pantal : int print() : void Lastbil maxlast : double print() : void

Fordonshierarkin i kod public class Fordon { public void print() { System.out.print("Fordon"); public class Spark extends Fordon { public class Cykel extends Fordon { public void print() { System.out.print("Cykel"); public class Bil extends Fordon { double vikt; public Bil( double v ) { vikt = v; public void print() { System.out.print("Bil med vikt " + vikt); (16 november 2009 Klasshierarkier 6 )

Användning Koden... public static void pr(string s) { System.out.print(s); public static void main(string [] args) { Fordon f = new Fordon(); Spark s = new Spark(); Cykel c = new Cykel(); Bil b = new Bil(1.2); pr("f: "); f.print(); pr("\n"); pr("s: "); s.print(); pr("\n"); pr("c: "); c.print(); pr("\n"); pr("b: "); b.print(); pr("\n");... ger utskriften f: Fordon s: Fordon c: Cykel b: Bil med vikt 1.2 (16 november 2009 Klasshierarkier 7 )

(16 november 2009 Klasshierarkier 8 ) Flera subklasser public class Personbil extends Bil { int pantal = 5; public Personbil(double v) { super(v); public Personbil(double v, int ant) { super(v); pantal = ant; public void print() { System.out.print("Person"); super.print(); System.out.print(" och platsantal " + pantal);

(16 november 2009 Klasshierarkier 9 ) Fortsättning av main... Personbil pb1 = new Personbil(1.5); Personbil pb2 = new Personbil(0.9,4); pr("pb1: "); pb1.print(); pr("\n"); pr("vikt b : " + b.vikt + "\n"); pr("vikt pb1: " + pb1.vikt + "\n"); f = b; pr("f: "); f.print(); pr("\n"); f = pb1; pr("f: "); f.print(); pr("\n"); pb1 = (Personbil) f; pr("pb1: "); pb1.print(); pr("\n"); ger utskrifterna pb1: PersonBil med vikt 1.5 och platsantal 5 Vikt b: 1.2 Vikt pb1: 1.5 f: Bil med vikt 1.2 f: PersonBil med vikt 0.9 och platsantal 4 pb1: PersonBil med vikt 0.9 och platsantal 4

(16 november 2009 Klasshierarkier 10 ) Exempel på illegala operationer pb1 = f; pb1 = (Personbil) c; pr("vikt: " + f.vikt); pb1 = (Personbil) f; // om f ej refererar Personbil Den sista kan göras säker genom if ( f instanceof Personbil ) pb1 = (Personbil) f; else... Operatorn instanceof bör sällan användas!

Sammanfattning Om klassen S är en subklass till klassen B och om s är deklarerad som en referens till S och b till B så gäller I Ett objekt ur klassen S har alla attribut och metoder som klassen B har I Om S deklarerar ett attribut som nns i B så överskuggas Bs attribut. I En referens får referera objekt ur deklarerad klass och dess subklasser. I För att konstruktionen b.x (eller b.x()) skall vara tillåten måste attributet (eller metoden) x nnas deklarerad i B eller någon basklass till B. I När man anger ett attribut a via punktnotation p.a så är det hur p är deklarerad som avgör vilket attribut som väljs. I När man anropar en metod m via p.m() så är det typen på det element som p verkligen refererar som avgör vilken metod som väljs (så kallad dynamisk eller sen bindning). (16 november 2009 Klasshierarkier 11 )

(16 november 2009 Klasshierarkier 12 ) Metoder som bara nns i vissa klasser Fordon print() : void Spark Cykel print() : void Bil vikt : double print() : void Personbil pantal : int print() : void skatt() : double Lastbil maxlast : double print() : void skatt() : double Bilar beskattas men beräkningen görs på olika sätt för person- och lastbilar.

(16 november 2009 Klasshierarkier 13 ) Användning av skatt-metoden Bil b = new Lastbil(3., 2.);... if (...) { b = new Personbil(1.2, 5);... double s; s = b.skatt(); s = ((Lastbil) b).skatt(); // Illegalt! Skatt inte finns i b // Riskabelt! if ( b instanceof Lastbil ) // Fungerar men klumpigt och s = ((Lastbil) b).skatt(); // oflexibelt else if ( b instanceof Personbil ) s = ((Personbil) b).skatt(); else s = 0;

Bättre Deniera dessutom en skatt-metod i klassen Bil eller, troligen bättre, i klassen Fordon: Fordon print() : void skatt() : double Spark Cykel print() : void Bil vikt : double print() : void Personbil pantal : int print() : void skatt() : double Lastbil maxlast : double print() : void skatt() : double public class Fordon { public void print() { System.out.print("Fordon"); public double skatt() { return 0; (16 november 2009 Klasshierarkier 14 )

Skyddsnivåer I private Endast åtkomligt från klassens egna metoder I public Åtkomligt för alla I protected Åtkomligt från egna subklasser och klasser i samma paket I package Om ingen skyddsnivå anges så ges alla klasser i samma paket åtkomsträttighet (16 november 2009 Klasshierarkier 15 )

Konstruktorer vid arv Konstruktorer ärvs inte När ett objekt ur en subklass skapas så sker följande: 1. Instansvariablerna får sina defaultvärden 2. En konstruktor för superklassen anropas. Man använder super för att specicera vilken av basklassens konstruktor som skall användas. Om super inte används anropas basklassens parameterlösa konstruktor som då måste nnas. 3. Eventuella initieringsuttryck evalueras och tilldelas respektive instansvariabler 4. Satserna i subklassens konstruktor exekveras Använd super i stället för att upprepa kod! (16 november 2009 Klasshierarkier 16 )

(16 november 2009 Klasshierarkier 17 ) Standardprogramvara i Java Hela Java-miljön bygger på arv och klasshierakier! Exempel: 1. Klasserna för undantag: Throwable med underklasserna Error och Exception med underklasserna... 2. Graska komponenter: Component med underklasser Button, Checkbox, Container,... där t ex Container har underklasserna Panel, Window... 3. Avbildningar: Map med bl a underklassen HashMap 4. Samlingsklasserna: Collection med bl a underklassen och List som bl a har underklasserna Vector och LinkedList (Map, Collection och List är egentligen interface och inte klasser)

Klassen Object Klassen Object är basklass till alla klasser. En referens till Object får således referera vilket objekt som helst. Detta kan utnyttjas för att göra generella samlingsklasser (listor, tabeller... ): class ListNode { Object info; ListNode next; ListHead(Object i, ListNode n) { info = l; next = n; public class List { ListNode head; public void insertfirst(object o) { head = new ListNode(o, head)... (16 november 2009 Klasshierarkier 18 )

(16 november 2009 Klasshierarkier 19 ) Klassen Object forts Några metoder i klassen Object: I Object clone() I boolean equals(object o) I String tostring() Ofta anledning att omdeniera dessa!

Exempel på användning av arv: geometriska gurer Skriv ett program som kan hantera bilder bestående av cirklar, rektanglar och andra geometriska former. Programmet ska kunna I representera ett antal olika gurer, I rita upp en bild av de representerade gurerna, I beräkna den sammanlagda ytan av gurerna och I kunna läsa in hur en bild ska vara uppbyggd. (en rad andra operationer är naturligtvis tänkbara: ytta, rotera, skala... ) (16 november 2009 Klasshierarkier 20 )

(16 november 2009 Klasshierarkier 21 ) Forts geometriska gurer 1. Vilka klasser behövs för att representera gurerna? Circle, Rectangle,... 2. Vilka attribut och metoder ska nnas? I konstruktorer I metod för ytberäkning I metod för att rita 3. Hur skall man representera en mängd sådana gurer? I array? I lista? I annan struktur? Vilken typ skall det vara på elementen i strukturen?

(16 november 2009 Klasshierarkier 22 ) Forts geometriska gurer Shape xcoord : int ycoord : int area() : double paint():void Circle radius: int area(): double paint():void Rectangle width : int height : int area() : double paint():void

(16 november 2009 Klasshierarkier 23 ) Forts geometriska gurer Nu kan vi t ex göra en Shape[] fig = new Shape[100]; fig[0] = new Recatangle(...); fig[1] = new Circle(...);... (fast vi skall använda en mer exibel struktur än en array) Det nns ingen meningsfull implementation av area() och paint() i Shape! Deklarera dessa metoder och klassen Shape som abstract.

(16 november 2009 Klasshierarkier 24 ) Forts geometriska gurer import java.awt.*; public abstract class Shape { protected int xcoord, ycoord; public Shape(int x, int y) { xcoord = x; ycoord = y; public abstract double area(); public abstract void paint(graphics g);

(16 november 2009 Klasshierarkier 25 ) Forts geometriska gurer import java.awt.*; public class Circle extends Shape { protected int radius; public Circle(int x, int y, int r){ super(x,y); radius = r; public double area(){ return Math.PI*radius*radius; public void paint(graphics g){ g.setcolor(color.red); g.filloval(xcoord-radius, ycoord-radius, 2*radius, 2*radius);

(16 november 2009 Klasshierarkier 26 ) Forts geometriska gurer import java.awt.*; public class Rectangle extends Shape { protected int width, height; public Rectangle(int x, int y, int w, int h) { super(x,y); width = w; height = h; public double area(){ return width*height; public void paint(graphics g){ g.setcolor(color.blue); g.fillrect(xcoord,ycoord,width,height);

(16 november 2009 Klasshierarkier 27 ) Forts geometriska gurer För att samla ihop ett antal olika gurer skall vi använda en av Javas samlingsklasser: LinkedList som är en subklass (indirekt) till klassen Collection (egentligen ett interface). För denna uppgifts skull räcker det med att kunna I Skapa ett LinkedList-objekt: Collection<Shape> shapes = new LinkedList<Shape>(); I Lägga in gurer i listan. T ex: shapes.add(new Circle(x,y,r)); I Iterera över elementen och komma åt deras metoder. T ex: for (Shape s:shapes) s.paint();

Forts geometriska gurer import javax.swing.*; import java.awt.*; import java.util.*; public class Drawing extends JPanel { private Collection<Shape> shapes; public Drawing(Collection<Shape> s, int w, int h) { shapes = s; setbackground(color.white); setpreferredsize(new Dimension(w,h)); public double area(){ double a = 0; for (Shape s:shapes) a += s.area(); return a; public void paintcomponent(graphics g){ super.paintcomponent(g); for (Shape s:shapes) s.paint(g); (16 november 2009 Klasshierarkier 28 )

(16 november 2009 Klasshierarkier 29 ) Forts geometriska gurer import javax.swing.*; import java.awt.*; import java.util.*; public class DrawTest extends JFrame { public static void main(string[] args){ Collection<Shape> shapes = read(new Scanner(System.in)); Drawing d=new Drawing(shapes,400,400); System.out.println("Total area: " + (int)d.area()); new DrawTest(d); public DrawTest(Drawing d){ getcontentpane().add(d); pack(); settitle("drawtest"); setdefaultcloseoperation(exit_on_close); setvisible(true);

Forts geometriska gurer private static Collection<Shape> read(scanner sc){ Collection<Shape> shapes = new LinkedList<Shape>(); while (sc.hasnext()){ String s=sc.next(); if (s.equals("circle")){ int x, y, r; x = sc.nextint(); y = sc.nextint(); r = sc.nextint(); shapes.add(new Circle(x,y,r)); else { int x, y, w, h; x = sc.nextint(); y = sc.nextint(); w = sc.nextint(); h = sc.nextint(); shapes.add(new Rectangle(x,y,w,h)); return shapes; (16 november 2009 Klasshierarkier 30 )

(16 november 2009 Klasshierarkier 31 ) Forts geometriska gurer Observera hur klasserna bygger på arv från Javas grak-klasser. Detaljerna i graken är överkurs. Om programmet körs med java DrawTest < figure.txt och len figure.txt har innehållet rectangle 20 50 200 30 circle 350 100 30 rectangle 300 200 50 150 circle 100 300 80

Forts geometriska gurer (16 november 2009 Klasshierarkier 32 )