Præsentation er lastning. Vent venligst

Præsentation er lastning. Vent venligst

 1999, Henrik B. ChristensenIntroducerende objektorienteret programmering8A.1 Polymorfi og nedarvning Motivation for arv og “mange former”

Lignende præsentationer


Præsentationer af emnet: " 1999, Henrik B. ChristensenIntroducerende objektorienteret programmering8A.1 Polymorfi og nedarvning Motivation for arv og “mange former”"— Præsentationens transcript:

1  1999, Henrik B. ChristensenIntroducerende objektorienteret programmering8A.1 Polymorfi og nedarvning Motivation for arv og “mange former”

2  1999, Henrik B. ChristensenIntroducerende objektorienteret programmering8A.2 Nedarvning  I har allerede set eksempler på nedarvning 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  1999, Henrik B. ChristensenIntroducerende objektorienteret programmering8A.3 Nedarvede objekter  Nedarvede objekter indeholder foreningsmængden af variable og metoder for alle dens superklasser 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 instance = new c(); instance:

4  1999, Henrik B. ChristensenIntroducerende objektorienteret programmering8A.4 Klassehierarki  De lærde skildpadder og a, b, og c-klasserne er eksempler på klassehierarkier: Turtle SkilledTurtle a b c nedarvnings eller is-a (er-en) relation

5  1999, Henrik B. ChristensenIntroducerende objektorienteret programmering8A.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

6  1999, Henrik B. ChristensenIntroducerende objektorienteret programmering8A.6 Skildpadden kan hjælpe os rectangle int w, h Turtle t Color c draw() move() w h t:c: Color.blue

7  1999, Henrik B. ChristensenIntroducerende objektorienteret programmering8A.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 );  }

8  1999, Henrik B. ChristensenIntroducerende objektorienteret programmering8A.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);  }

9  1999, Henrik B. ChristensenIntroducerende objektorienteret programmering8A.9 move()  Nogle forslag? public void move( int distance ) { t.setColor( Color.white ); draw(); t.setColor( c ); t.move( distance ); draw(); }

10  1999, Henrik B. ChristensenIntroducerende objektorienteret programmering8A.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(); }

11  1999, Henrik B. ChristensenIntroducerende objektorienteret programmering8A.11 Trekant triangle int b Turtle t Color c draw() move() erase() b bb t:c: Color.red

12  1999, Henrik B. ChristensenIntroducerende objektorienteret programmering8A.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 );  }

13  1999, Henrik B. ChristensenIntroducerende objektorienteret programmering8A.13 draw()  public void draw() {  t.move(b); t.turn(120);  }

14  1999, Henrik B. ChristensenIntroducerende objektorienteret programmering8A.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(); }

15  1999, Henrik B. ChristensenIntroducerende objektorienteret programmering8A.15 Nye figurer  Cirkler, stjerner, rhomber, femkanter, …  Hvordan undgår vi at skrive det samme kode igen og igen?  Nogle forslag?

16  1999, Henrik B. ChristensenIntroducerende objektorienteret programmering8A.16 En systemfunktion  Måske en systemfunktion “move”?  Metode generalMove( ???? )  Men hvad skal parameteren være? Vi kan ikke acceptere et vilkårligt argument; f.eks. hvad betyder “move” af et Date objekt?

17  1999, Henrik B. ChristensenIntroducerende objektorienteret programmering8A.17 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

18  1999, Henrik B. ChristensenIntroducerende objektorienteret programmering8A.18 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

19  1999, Henrik B. ChristensenIntroducerende objektorienteret programmering8A.19 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)

20  1999, Henrik B. ChristensenIntroducerende objektorienteret programmering8A.20 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

21  1999, Henrik B. ChristensenIntroducerende objektorienteret programmering8A.21 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 { … }

22  1999, Henrik B. ChristensenIntroducerende objektorienteret programmering8A.22 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

23  1999, Henrik B. ChristensenIntroducerende objektorienteret programmering8A.23 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,...

24  1999, Henrik B. ChristensenIntroducerende objektorienteret programmering8A.24 En generel figur figur Turtle t Color c figur(t,c) draw() move() erase() t:c: Color.green

25  1999, Henrik B. ChristensenIntroducerende objektorienteret programmering8A.25 Konstruktør protected shape( Color color, TurtleWorld sandbox ) { t = new Turtle( sandbox ); t.penUp(); t.moveTo( 100, 100 ); t.penDown(); t.setColor( color ); }

26  1999, Henrik B. ChristensenIntroducerende objektorienteret programmering8A.26 move() public void erase() { t.setColor( Color.white ); draw(); t.setColor( c ); } public void move( int distance ) { erase(); t.move( distance ); draw(); }

27  1999, Henrik B. ChristensenIntroducerende objektorienteret programmering8A.27 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

28  1999, Henrik B. ChristensenIntroducerende objektorienteret programmering8A.28 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

29  1999, Henrik B. ChristensenIntroducerende objektorienteret programmering8A.29 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 ); 

30  1999, Henrik B. ChristensenIntroducerende objektorienteret programmering8A.30 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); }

31  1999, Henrik B. ChristensenIntroducerende objektorienteret programmering8A.31 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”.

32  1999, Henrik B. ChristensenIntroducerende objektorienteret programmering8A.32 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); }

33  1999, Henrik B. ChristensenIntroducerende objektorienteret programmering8A.33 Brugseksempel  triangle f = new triangle( 80, Color.red, sandbox );  for ( int i = 0; i < 100; i++ ) {  f.draw();  f.move( 2 );  }

34  1999, Henrik B. ChristensenIntroducerende objektorienteret programmering8A.34 Polymorfi  I objektorienterede 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 );

35  1999, Henrik B. ChristensenIntroducerende objektorienteret programmering8A.35 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 navn, returtype, og parameterliste som en metode i superklassen (eller dens superklasse osv.)

36  1999, Henrik B. ChristensenIntroducerende objektorienteret programmering8A.36 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.

37  1999, Henrik B. ChristensenIntroducerende objektorienteret programmering8A.37 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

38  1999, Henrik B. ChristensenIntroducerende objektorienteret programmering8A.38 Overskrivning af draw() shape Turtle t Color c figur(t,c) draw() move() 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() Klasse perspektiv Objekt perspektiv f:

39  1999, Henrik B. ChristensenIntroducerende objektorienteret programmering8A.39 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()

40  1999, Henrik B. ChristensenIntroducerende objektorienteret programmering8A.40 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();  }

41  1999, Henrik B. ChristensenIntroducerende objektorienteret programmering8A.41 Udvidelse  Lad os lave en specialisering af rektanglet, nemlig et rektangel med et kryds i:

42  1999, Henrik B. ChristensenIntroducerende objektorienteret programmering8A.42 Klassehierarki figur trekantrektangel Xrektangel

43  1999, Henrik B. ChristensenIntroducerende objektorienteret programmering8A.43 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

44  1999, Henrik B. ChristensenIntroducerende objektorienteret programmering8A.44 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.

45  1999, Henrik B. ChristensenIntroducerende objektorienteret programmering8A.45 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

46  1999, Henrik B. ChristensenIntroducerende objektorienteret programmering8A.46 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; }

47  1999, Henrik B. ChristensenIntroducerende objektorienteret programmering8A.47 Synlighed  En del af en klasses kontrakt er angivelse af metoder og variables synlighed:  privateAngives ved private  packageAngives ved ingen modifikation  protectedAngives ved protected  publicAngives ved public

48  1999, Henrik B. ChristensenIntroducerende objektorienteret programmering8A.48 Synlighed  private –Metoden/variablen er kun tilgængelige i klassen selv.  package (ingen modifikation) –Metoden/variable er tilgængelig i klassen selv, og tilgængelig for, og nedarves til, kode i samme pakke (package).  protected –Metoden/variable er tilgængelig i klassen selv, og tilgængelig for, og nedarves til, kode i samme pakke (package) og kode i subklasser.  public –Tilgængelig for alle med tilgang til klassen, og nedarves til alle subklasser

49  1999, Henrik B. ChristensenIntroducerende objektorienteret programmering8A.49 Synlighed  Synlighed er en vigtig del af kontrakten idet den angiver, hvad en klasse opfatter som metoder/variable, der er tilgængelige for brugeren og hvilke der ikke er.  Tommelfingerreglen Brug public for det som er kontrakten udadtil (vendt mod brugeren) Brug protected eller, stærkere, private til metoder til internt brug (vendt mod producenten).

50  1999, Henrik B. ChristensenIntroducerende objektorienteret programmering8A.50 Object  Object er implicit superklasse for alle klasser  Derfor arver alle klasser automatisk: String toString() boolean equals(Object o)


Download ppt " 1999, Henrik B. ChristensenIntroducerende objektorienteret programmering8A.1 Polymorfi og nedarvning Motivation for arv og “mange former”"

Lignende præsentationer


Annoncer fra Google