Download præsentationen
Præsentation er lastning. Vent venligst
Offentliggjort afSidsel Rasmussen Redigeret for ca. et år siden
1
DAIMIIntroducerende Objektorienteret Programmering1 Polymorfi og nedarvning Motivation for arv og “mange former”
2
DAIMIIntroducerende Objektorienteret Programmering2 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
3
DAIMIIntroducerende Objektorienteret Programmering3 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:
4
DAIMIIntroducerende Objektorienteret Programmering4 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
5
DAIMIIntroducerende Objektorienteret Programmering5 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
6
DAIMIIntroducerende Objektorienteret Programmering6 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
7
DAIMIIntroducerende Objektorienteret Programmering7 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 ); }
8
DAIMIIntroducerende Objektorienteret Programmering8 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); }
9
DAIMIIntroducerende Objektorienteret Programmering9 move() Nogle forslag? public void move( int distance ) { t.setColor( Color.white ); draw(); t.setColor( c ); t.move( distance ); draw(); }
10
DAIMIIntroducerende Objektorienteret Programmering10 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(); }
11
DAIMIIntroducerende Objektorienteret Programmering11 Trekant Triangle int b Turtle t Color c draw() move() erase() b bb t:c: Color.red
12
DAIMIIntroducerende Objektorienteret Programmering12 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 ); }
13
DAIMIIntroducerende Objektorienteret Programmering13 draw() public void draw() { t.move(b); t.turn(120); }
14
DAIMIIntroducerende Objektorienteret Programmering14 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(); }
15
DAIMIIntroducerende Objektorienteret Programmering15 Nye figurer Cirkler, stjerner, rhomber, femkanter, … Hvordan undgår vi at skrive det samme kode igen og igen? Nogle forslag?
16
DAIMIIntroducerende Objektorienteret Programmering16 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
17
DAIMIIntroducerende Objektorienteret Programmering17 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
18
DAIMIIntroducerende Objektorienteret Programmering18 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)
19
DAIMIIntroducerende Objektorienteret Programmering19 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
20
DAIMIIntroducerende Objektorienteret Programmering20 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 { … }
21
DAIMIIntroducerende Objektorienteret Programmering21 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
22
DAIMIIntroducerende Objektorienteret Programmering22 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,...
23
DAIMIIntroducerende Objektorienteret Programmering23 En generel figur Shape Turtle t Color c figur(t,c) draw() move() erase() t:c: Color.green
24
DAIMIIntroducerende Objektorienteret Programmering24 Konstruktør protected Shape( Color color, TurtleWorld sandbox ) { t = new Turtle( sandbox ); t.penUp(); t.moveTo( 100, 100 ); t.penDown(); t.setColor( color ); }
25
DAIMIIntroducerende Objektorienteret Programmering25 move() public void erase() { t.setColor( Color.white ); draw(); t.setColor( c ); } public void move( int distance ) { erase(); t.move( distance ); draw(); }
26
DAIMIIntroducerende Objektorienteret Programmering26 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
27
DAIMIIntroducerende Objektorienteret Programmering27 Abstrakt figur klasse abstract class Shape { protected Turtle t; protected Color c; protected Shape( Color color, TurtleWorld sandbox ) { t = new Turtle( sandbox ); 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
28
DAIMIIntroducerende Objektorienteret Programmering28 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 );
29
DAIMIIntroducerende Objektorienteret Programmering29 Rektangel som specialisering class Rectangle extends Shape { private int w, h; public Rectangle( int width, int height, Color color, TurtleWorld sandbox ) { super( color, sandbox ); 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
30
DAIMIIntroducerende Objektorienteret Programmering30 Brugseksempel Rectangle f = new Rectangle( 80, 30, Color.black, sandbox ); 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”.
31
DAIMIIntroducerende Objektorienteret Programmering31 trekant som specialisering class Triangle extends Shape { private int b; public Triangle( int basis, Color color, TurtleWorld sandbox ) { super( color, sandbox ); b = basis; } public void draw() { t.move(b); t.turn(120); }
32
DAIMIIntroducerende Objektorienteret Programmering32 Brugseksempel Triangle f = new Triangle( 80, Color.red, sandbox ); for ( int i = 0; i < 100; i++ ) { f.draw(); f.move( 2 ); }
33
DAIMIIntroducerende Objektorienteret Programmering33 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)
34
DAIMIIntroducerende Objektorienteret Programmering34 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 )
35
DAIMIIntroducerende Objektorienteret Programmering35 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.
36
DAIMIIntroducerende Objektorienteret Programmering36 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
37
DAIMIIntroducerende Objektorienteret Programmering37 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:
38
DAIMIIntroducerende Objektorienteret Programmering38 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()
39
DAIMIIntroducerende Objektorienteret Programmering39 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(); }
40
DAIMIIntroducerende Objektorienteret Programmering40 Udvidelse Lad os lave en specialisering af rektanglet, nemlig et rektangel med et kryds i:
41
DAIMIIntroducerende Objektorienteret Programmering41 Klassehierarki Figur TrekantRektangel XRektangel
42
DAIMIIntroducerende Objektorienteret Programmering42 XRektangel class XRectangle extends Rectangle { … public void draw() { double hypo = Math.sqrt( w*w + h*h ); double angle = Math.acos( w / hypo ) * 180 / 3.1415; 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
43
DAIMIIntroducerende Objektorienteret Programmering43 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.
44
DAIMIIntroducerende Objektorienteret Programmering44 super tricks class superexample { public static void main( String args[] ) { A instance = new C(); System.out.println( "Output is: "+ instance.name() ); } class A { public String name() { return "I am in A"; } } class B extends A { public String name() { return "I am in B, super=" + super.name(); } } class C extends B { public String name() { return "I am in C, super=" + super.name(); } } Hvad er output af dette lille program? 1)I am in C, super = I am in B, super= I am in B, super= I am in B,… 2)I am in C, super = I am in B, super= I am in A
45
DAIMIIntroducerende Objektorienteret Programmering45 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, TurtleWorld sandbox ) { super( color, sandbox ); w = width; h = height; }
46
DAIMIIntroducerende Objektorienteret Programmering46 Object Object er implicit superklasse for alle klasser Derfor arver alle klasser automatisk: String toString() boolean equals(Object o)
47
DAIMIIntroducerende Objektorienteret Programmering47 Turtle i en ny rolle… Nøgleordet i datalogi er Abstraktion Se bort fra detaljerne og fokuser på essentielle egenskaber I de første uger var problemet at forstå turtle’n; nu tager vi den istedet i brug som en problemløser — et tegneværktøj i Java. dagens problem er morgendagens løsning…
Lignende præsentationer
© 2024 SlidePlayer.dk Inc.
All rights reserved.