 Jens Bennedsen 2001Multimedie programmering10A.1 Polymorfi og nedarvning Motivation for arv og “mange former”

Slides:



Advertisements
Lignende præsentationer
Velkommen til Softwarekonstruktion
Advertisements

07 – Kort om OO Introduktion.
KONCEPT Klasser og objekter En klasse beskriver et World ArrayList
Selve objektet versus referencen til objektet Nedarvning
Objektorienteret programmering
08 – Mere OO Indkapsling Arv og polymorfi (OOP’s 3 hovedprincipper)
09 – Arv og polymorfi i java
Hvordan man skriver koden.
VOOP, 8 april Refleksion i objekt orienterede programmeringssprog Mandag 8/ Kasper Østerbye.
Arv Idéen i arv et at kunne genbruge gennem generalisering
FEN NOEA/IT Programmeringsteknologi 1 Arv og polymorfi Substitutionsprincippet Abstrakte klasser Design Patterns (Composite)
Interfaces – brug. Overblik Tidligere: –Interfaces Comparable gør det muligt at bruge Collections metoderne –min, max, sort, … –Algoritmemønstre Find.
Eksempel på realisering af domænemodel
GP 8, 24/ Grundlæggende programmering Efterår 2001 Forelæsning 8 onsdag 24/ kl. 9:15 – 12:00.
Objekter og klasser Rasmus D. Lehrmann DM
GP7, Martin Lillholm 1 Grundlæggende Programmering (GP) Efterår 2005 Forelæsning 7 Slides ligger på nettet. Du er velkommen til at printe dem nu. Vi begynder.
8 RÅD VEDRØRENDE GOD PROGRAMMERING Effective (brown) Java.
FEN IntroJava AAU1 Klasser og objekter Grundbegreber Student-Course.
FEN IntroJava AAU1 Grafik – Crayon-objekter.
Nedarvning.
Forelæsning 2.2 Tilstand og opførsel (repetition)
FEN NOEA - Nordjyllands Erhvervsakademi1 Objektorienteret programmering Indkapsling Arv og polymorfi (OOP’s 3 hovedprincipper)
Effective Java Blå gruppe. Item 18: Interfaces frem for abstrakte klasser Kan implementeres i klasser der ikke nedarver Eksisterende klasser kan nemt.
Begreber og Redskaber 4. Plan for idag Om metoder, parametre, returværdier Et par ord om objekt-orientering Håndkøring af programmer.
Begreber og Redskaber 3. Plan for idag Om metoder, parametre, returværdier Overblik over klasser,objekter,nedarvning Et par ord om objekt-orientering.
 Jens Bennedsen 2002Objektorienteret systemudvikling Design klasse model ”Klassemodellen på vej til kode”
 Jens Bennedsen 2002Objektorienteret systemudvikling Persistens.
 Bærbak & Caspersen, 2000Introducerende objektorienteret programmering1.1 Turtlemaskinen Arkitektur, instruktionssæt og eksempler.
DAIMIIntroducerende Objektorienteret Programmering1 Polymorfi og nedarvning Motivation for arv og “mange former”
 1999, Henrik B. ChristensenIntroducerende objektorienteret programmering8A.1 Polymorfi og nedarvning Motivation for arv og “mange former”
Lærde skildpadder Specialisering af skildpadder – nye kompetencer (metoder/kommandoer)
DAIMIIntroducerende objektorienteret programmering4B.1 Typer og tilstand i Java Typer, tilstand, erklæring, variable, primitive datatyper, reference- og.
Klasser og objekter. dIntProg, E08Klasser og objekter.2 Grundbegreber Klasser og objekter –beskrivelse –oprettelse Attributter og metoder –tilstand –opførsel.
DAIMIIntroducerende objektorienteret programmering12A.1 Moduler Packages i Java.
DAIMIIntroducerende objektorienteret programmering3B.1 Definition af klasser Klasseskelet, metoder, et eksempel: dato.
 Henrik B. Christensen, 1999Introducerende objektorienteret programmering8B.1 Interfaces En ren kontrakt.
 Jens Bennedsen, 2003Introducerende objektorienteret programmeringinterfaces.1 Interfaces En ren kontrakt.
DAIMIIntroducerende objektorienteret programmeringkd.1 Definition af klasser Klasseskelet, metoder, et eksempel: dato.
 Michael E. Caspersen, 2000Introducerende objektorienteret programmering6A.1 Programmering med interfaces – en stak og en HP-regnemaskine push pop.
 Henrik Bærbak, 2000Introducerende objektorienteret programmering11B.1 Destilleret UML Oversættelse fra UML til Java.
DAIMIIntroducerende objektorienteret programmering1B.1 Skildpadder Modeller, objekter og opførsel.
DAIMIIntroducerende objektorienteret programmering4B.1 Grundlæggende og Reference Typer i Java Typer, tilstand, erklæring, reference- og værdi semantik,
Klassehierarkier Specialisering vha. subklasser. dIntProg, E05Klassehierarkier.2 Oversigt Eksempler på specialisering –Aktør, Koreograf, Skuespiller,
Interfaces Afkobling af programkomponenter (eksempel: Comparable)
Polymorfi Abstrakte klasser, substitutionsprincippet, statisk og dynamisk type.
 Jens Bennedsen 2001Multimedie programmering13.1 Lingo Objectorienteret Lingo.
Lærde skildpadder Specialisering af skildpadder – nye kompetencer (metoder/kommandoer)
Kari Rye Schougaard, Ph.d.-stud. Værktøjer og Teknikker, 2006 A A R H U S U N I V E R S I T E T DATALOGISK INSTITUT Java på 20 minutter (eller lidt mere)
DAIMIIntroducerende Objektorienteret Programmering8A.1 Polymorfi og nedarvning Motivation for arv og “mange former”
Grafik Modeller, objekter og opførsel. dIntProg, F08Grafik.2 Nye begreber Repetition (iteration) –gentagelse af opførsel Parametrisering –generalisering.
Klasser og objekter – grundbegreber.  Michael E. Caspersen, 2001Introducerende objektorienteret programmeringKlasser og objekter.2 Klasser og objekter.
Interfaces – hvorfor, hvad og hvordan?.  Michael E. Caspersen 2003IOOPInterfaces.2 Oversigt Interfaces, hvorfor –Separering af specifikation (interface)
 Jens Bennedsen 2001Multimedie programmering10B.1 Interfaces En ren kontrakt.
Jesper Mosegaard Multimedie Programmering E2003 MMProg uge46 Ancestor.
 Jens Bennedsen 2001Multimedie programmering4.1 Definition af begreber Interface, implements, klasse.
 Jens Bennedsen 2001Multimedie programmering1.1 Skildpadder Modeller, objekter og opførsel.
DAIMIIntroducerende objektorienteret programmering4A.1 Kontrakter og Design Kontraktbaseret design, JavaDoc dokumentation,
Lærde skildpadder Specialisering af skildpadder – nye kompetencer (metoder/kommandoer)
 Jens Bennedsen 2001Multimedie programmering3A.1 Definition af klasser Klasseskelet, metoder, et eksempel: dato.
Virkefeltsregler i Java int i; int j; int k; i = i+j; String t; Sequence s; int i; int j; Sequence s; String s; int i; int j;
DAIMIIntroducerende Objektorienteret Programmering8B.1 Interfaces En ren kontrakt.
DAIMI, AUIntroducerende objektorienteret programmering11A.1 Destilleret UML Oversættelse fra UML til Java.
DAIMIIntroducerende objektorienteret programmering15A.1 Eksamen…
DAIMIIntroducerende objektorienteret programmering2A.1 Lærde skildpadder Specialisering af skildpadder – nye kompetencer (metoder/kommandoer)
Skildpadder Modeller, objekter og opførsel.  Michael E. Caspersen, 2000Introducerende objektorienteret programmeringSkildpadder.2 Model Modeller bruges.
Objecter Introduktion Webintegrator HF1 PHP Object orienteret.
Forelæsning Uge 2 – Mandag
Klasser og objekter (Afsnit i manualen).
Parametrisering En kort introduktion.
Forelæsning Uge 2 – Mandag
Præsentationens transcript:

 Jens Bennedsen 2001Multimedie programmering10A.1 Polymorfi og nedarvning Motivation for arv og “mange former”

 Jens Bennedsen 2001Multimedie programmering10A.2 Nedarvning I har allerede set eksempler på nedarvning (inheritance) af egenskaber, nemlig med de lærde skildpadder class SkilledTurtle extends Turtle { public void box() { //tegner et kvadrat med sidelængde 100 for (int i=0; i<4; i++) { move(100); turn(90); } } public void spirille() { //tegner en spirille med sidelængde 100 for (int i=0; i<36; i++) { box(); turn(10); } } } En SkilledTurtle arver egenskaberne fra Turtle, og specialiserer (udvider) med nye metoder eller variable

 Jens Bennedsen 2001Multimedie programmering10A.3 Nedarvede objekter Nedarvede objekter indeholder foreningsmængden af instansvariable og metoder for alle dens superklasser (super class) class a { public int num = 37; public int getNum() { return num; } } class b extends a { public Date d = new Date(); public Date getDate() { return d; } } class c extends b { public double v = 23.34; } num d v getNum() getDate() c myObject = new c(); myObject:

 Jens Bennedsen 2001Multimedie programmering10A.4 Klassehierarki De lærde skildpadder og a, b, og c-klasserne er eksempler på klassehierarkier (class hierarchy): Turtle SkilledTurtle a b c nedarvnings- eller is-a (er-en) relation UML klassediagram notation klasse nedarvningsrelation

 Jens Bennedsen 2001Multimedie programmering10A.5 Motivation for polymorfi Vi er blevet bedt om at lave nogle klasser til at tegne figurer: Et rektangel og en trekant. Krav: –Skal kunne tegne dem i forskellige farver –Vi skal kunne flytte figurerne en afstand, d d

 Jens Bennedsen 2001Multimedie programmering10A.6 Skildpadden kan hjælpe os Rectangle int w, h Turtle t Color c draw() move() w h t:c: Color.blue UML-klasse med angivelse af instans- variable og metoder

 Jens Bennedsen 2001Multimedie programmering10A.7 Konstruktør Rektangel: public Rectangle( int width, int height, Color color, TurtleWorld sandbox ) { w = width; h = height; c = color; t = new Turtle( sandbox ); t.penUp(); t.moveTo( 100, 100 ); t.penDown(); t.setColor( color ); }

 Jens Bennedsen 2001Multimedie programmering10A.8 draw() public void draw() { t.move(w); t.turn(90); t.move(h); t.turn(90); t.move(w); t.turn(90); t.move(h); t.turn(90); }

 Jens Bennedsen 2001Multimedie programmering10A.9 move() Nogle forslag? public void move( int distance ) { t.setColor( Color.white ); draw(); t.setColor( c ); t.move( distance ); draw(); }

 Jens Bennedsen 2001Multimedie programmering10A.10 Sletning af en figur Den første del af move består jo i at slette den, så vi kunne dels få en mere læsevenlig kode, og tilføje en ny egenskab til vores klasse: Evnen til at blive slettet public void erase() { t.setColor( Color.white ); draw(); t.setColor( c ); } public void move( int distance ) { erase(); t.move( distance ); draw(); }

 Jens Bennedsen 2001Multimedie programmering10A.11 Trekant Triangle int b Turtle t Color c draw() move() erase() b bb t:c: Color.red

 Jens Bennedsen 2001Multimedie programmering10A.12 Konstruktør Trekant: public Triangle( int basis, Color color, TurtleWorld sandbox ) { b = basis; c = color; t = new Turtle( sandbox ); t.penUp(); t.moveTo( 100, 100 ); t.penDown(); t.setColor( color ); }

 Jens Bennedsen 2001Multimedie programmering10A.13 draw() public void draw() { t.move(b); t.turn(120); }

 Jens Bennedsen 2001Multimedie programmering10A.14 move() Nogle forslag? Aaarghh... public void erase() { t.setColor( Color.white ); draw(); t.setColor( c ); } public void move( int distance ) { erase(); t.move( distance ); draw(); }

 Jens Bennedsen 2001Multimedie programmering10A.15 Nye figurer Cirkler, stjerner, rhomber, femkanter, … Hvordan undgår vi at skrive det samme kode igen og igen? Nogle forslag?

 Jens Bennedsen 2001Multimedie programmering10A.16 Det objektorienterede svar De objekt-orienterede sprog giver en elegant mekanisme til at håndtere sådanne problemstillinger, både begrebsmæssigt og i praksis: Nedarvning og polymorfi

 Jens Bennedsen 2001Multimedie programmering10A.17 Indsigten “Vi er blevet bedt om at lave nogle klasser til at tegne figurer: Et rektangel og en trekant.” Der er et generelt begreb, nemlig figur, som begreberne rektangel og trekant er specialiseringer af. Figur TrekantRektangel

 Jens Bennedsen 2001Multimedie programmering10A.18 Generelle attributter Hvilke variable er interessante for alle figurer? Alle figurer bliver tegnet med en farve Alle figurer behøver en skildpadde til at gøre det beskidte arbejde (i vores sammenhæng)

 Jens Bennedsen 2001Multimedie programmering10A.19 Generelle metoder Hvilke metoder giver mening for en figur? draw()? –Naturligvis, en figur kan tegnes –men…, vi ved jo ikke hvordan den tegnes. Hmm... erase() ? –En figur kan generelt slettes ved at tegne den igen på samme sted med baggrundsfarven move()? –Det at flytte en figur er en generel problemstilling: slet den og gentegn den det nye sted

 Jens Bennedsen 2001Multimedie programmering10A.20 Generalisering/nedarvning I Java specialisere man klasser vha. extends: “class” class-name “extends” superclass-name “{“ class-definition “}” class Triangle extends Shape { … } class SkilledTurtle extends Turtle { … }

 Jens Bennedsen 2001Multimedie programmering10A.21 Kært barn... … har mange navne trekant arver fra/er en specialisering af figur. Figur er superklasse for/en generalisering af trekant. Figur Trekant superklasse, ancestor, parent class subklasse, child class, nedarvet klasse inheritance, nedarvning, is-a

 Jens Bennedsen 2001Multimedie programmering10A.22 En generelt figur klasse Vi kan samle den generelle viden om figurer i en generel klasse (superklasse): –De skal have en farve, som vi skal gemme –De skal bruge en skildpadde til tegnearbejdet –De skal kunne konstrueres –De skal kunne tegnes –De skal kunne flyttes –De skal kunne slettes Og hvem ved, hvad de skal kunne om lidt? –skifte farve, rotere,...

 Jens Bennedsen 2001Multimedie programmering10A.23 En generel figur Shape Turtle t Color c figur(t,c) draw() move() erase() t:c: Color.green

 Jens Bennedsen 2001Multimedie programmering10A.24 Konstruktør protected Shape( Color color, TurtleWorld sandbox ) { t = new Turtle( sandbox ); t.penUp(); t.moveTo( 100, 100 ); t.penDown(); t.setColor( color ); }

 Jens Bennedsen 2001Multimedie programmering10A.25 move() public void erase() { t.setColor( Color.white ); draw(); t.setColor( c ); } public void move( int distance ) { erase(); t.move( distance ); draw(); }

 Jens Bennedsen 2001Multimedie programmering10A.26 draw() Ja, hvad stiller vi egentlig op med draw??? Den skal være defineret; ellers kan move og erase jo ikke kalde den… Men vi kan ikke tegne en figur, når vi ikke ved, hvorledes den ser ud... Svaret er at udstyre klassen med en abstrakt egenskab, “at kunne tegne sig selv”, uden at specificere en konkret fremgangsmåde

 Jens Bennedsen 2001Multimedie programmering10A.27 Abstrakt figur klasse abstract class Shape { protected Turtle t; protected Color c; protected Shape( Color color) { t = new Turtle(); c = color; t.penUp(); t.moveTo( 100, 100 ); t.penDown(); t.setColor( color ); } public abstract void draw(); public void move( int distance ) { erase(); t.move( distance ); draw(); } public void erase() { … } } Kontrakten angiver at en figur kan tegnes - men binder sig ikke til en konkret implementation

 Jens Bennedsen 2001Multimedie programmering10A.28 Abstrakte klasser Abstrakte klasser angiver at de implementerer metoder, som deres specialiserende klasser vil give mening. Derfor kan abstrakte klasser heller ikke instantieres: Shapes2.java:50: class Shape is an abstract class. It can't be instantiated. Shape f = new Shape( Color.black, sandbox );

 Jens Bennedsen 2001Multimedie programmering10A.29 Rektangel som specialisering class Rectangle extends Shape { private int w, h; public Rectangle( int width, int height, Color color) { super( color); w = width; h = height; } public void draw() { t.move(w); t.turn(90); t.move(h); t.turn(90); t.move(w); t.turn(90); t.move(h); t.turn(90); } Kald superklassens konstruktør

 Jens Bennedsen 2001Multimedie programmering10A.30 Brugseksempel Rectangle f = new Rectangle( 80, 30, Color.black); for ( int i = 0; i < 100; i++ ) { f.draw(); f.move( 2 ); } f er en reference til et objekt af klassen “Rectangle” som arver fra “Shape”. Metoden draw() er defineret i klassen “Rectangle” mens metoden “move” er arvet fra superklassen “Shape”.

 Jens Bennedsen 2001Multimedie programmering10A.31 trekant som specialisering class Triangle extends Shape { private int b; public Triangle( int basis, Color color) { super( color); b = basis; } public void draw() { t.move(b); t.turn(120); }

 Jens Bennedsen 2001Multimedie programmering10A.32 Brugseksempel Triangle f = new Triangle( 80, Color.red); for ( int i = 0; i < 100; i++ ) { f.draw(); f.move( 2 ); }

 Jens Bennedsen 2001Multimedie programmering10A.33 Polymorfi I objekt-orienterede sprog kan en reference, der er erklæret som værende af en klassebaseret type A, referere til objekter af klassen A eller en subklasse af A. Objektet er polymorf, det kan have “mange former”. Shape f; f = new Rectangle( 80, 30, Color.black, sandbox ); f = new Triangle( 80, Color.red, sandbox ); Den erklærede type (Shape) Den aktuelle type (Triangle)

 Jens Bennedsen 2001Multimedie programmering10A.34 Overskrivning En subklasse kan vælge at overskrive (override) de metoder, den har arvet fra dens superklasse. Derved specialiserer subklassen den opførsel/funktionalitet som superklassen tilbyder. En overskreven metode har nøjagtig samme prototype som en metode i superklassen (eller dens superklasse osv.) (prototype = navn, returtype, og parameterliste )

 Jens Bennedsen 2001Multimedie programmering10A.35 Metodekald (invokation) Når en overskreven metode kaldes, skal det afgøres hvilken en i hierarkiet, der faktisk kaldes: Den metode, der bliver kaldt afgøres af objektets aktuelle type; og ikke af den erklærede type: Det er den mest specialiserede metode i arvehierarkiet, set fra objektets aktuelle type, der kaldes. Intuitivt kan man forestille sig, at objektet søger efter metoden, først i sig selv og dernæst igennem superklasserne indtil den finder metoden; derefter kaldes den.

 Jens Bennedsen 2001Multimedie programmering10A.36 Overskrivning af draw() Shape f; f = new Rectangle( 80, 30, Color.black, sandbox ); f.draw(); f = new Triangle( 80, Color.red, sandbox ); f.draw(); Erklæret type “Shape” men Rectangle’s draw() kaldes Erklæret type “Shape” men Triangle’s draw() kaldes

 Jens Bennedsen 2001Multimedie programmering10A.37 Overskrivning af draw() Shape Turtle t Color c figur(t,c) draw() move() erase() Rectangle int w, h rectangle(w,h,t,c) draw() Triangle int b triangle(b,t,c) draw() f = new triangle( 80, Color.red, sandbox ); Turtle t Color c int b Triangle(b,t,c) Triangle.draw() Shape.move() Shape.erase() Klasse perspektiv Objekt perspektiv f:

 Jens Bennedsen 2001Multimedie programmering10A.38 Hvad med move??? shape f; f = new rectangle( 80, 30, Color.black, sandbox ); f.move(30); Shape Rectangle public void move( int distance ) { erase(); t.move( distance ); draw(); } draw() erase() move() draw()

 Jens Bennedsen 2001Multimedie programmering10A.39 Generelle metoder Én stor fordel er, at generelle figurmetoder kan specificeres een gang for alle: abstract class Shape {... // Rotation af figuren public void rotate( int angle ) { erase(); t.turn( angle ); draw(); }

 Jens Bennedsen 2001Multimedie programmering10A.40 Udvidelse Lad os lave en specialisering af rektanglet, nemlig et rektangel med et kryds i:

 Jens Bennedsen 2001Multimedie programmering10A.41 Klassehierarki Figur TrekantRektangel XRektangel

 Jens Bennedsen 2001Multimedie programmering10A.42 XRektangel class XRectangle extends Rectangle { … public void draw() { double hypo = Math.sqrt( w*w + h*h ); double angle = Math.acos( w / hypo ) * 180 / ; t.turn( angle ); t.move( hypo ); t.turn( 180-angle ); t.move( w ); t.turn( 180-angle ); t.move( hypo); t.turn( 180+angle ); t.move( w ); t.turn( 180 ); } super.draw(); Kald superklassens draw metode

 Jens Bennedsen 2001Multimedie programmering10A.43 super super fungerer som en reference til objektet selv, som om den var en instans af superklassen. Dermed starter “søgningen” efter en metode et niveau højere oppe i klassehierarkiet, men set fra det sted, hvor “super” optræder i klassehierarkiet.

 Jens Bennedsen 2001Multimedie programmering10A.44 super i konstruktør super bruges ofte i konstruktører idet et nedarvet objekt kan konstrueres ved at konstruere superobjektet og derefter konstruere ens specialiseringer. public rectangle( int width, int height, Color color) { super( color, sandbox ); w = width; h = height; }

 Jens Bennedsen 2001Multimedie programmering10A.45 Object Object er implicit superklasse for alle klasser Derfor arver alle klasser automatisk: –String toString() –boolean equals(Object o)