Præsentation er lastning. Vent venligst

Præsentation er lastning. Vent venligst

Polymorfi Abstrakte klasser, substitutionsprincippet, statisk og dynamisk type.

Lignende præsentationer


Præsentationer af emnet: "Polymorfi Abstrakte klasser, substitutionsprincippet, statisk og dynamisk type."— Præsentationens transcript:

1 Polymorfi Abstrakte klasser, substitutionsprincippet, statisk og dynamisk type

2 dIntProg, E05polymorfi.2 Oversigt Abstrakt klasse –abstrakt metode => abstrakt klasse Substitution (forfremmelse) –Statisk type vs. dynamisk type –Statisk type: compile-time check (hvad er lovligt) –Dynamisk check: hvilken metode udføres –Specialisering af opførsel (redefinering af metode) –final (variabel, metode, klasse)

3 dIntProg, E05polymorfi.3 Et figurhierarki public abstract class Shape { private int x, y; public Shape(int x, int y) { this.x = x; this.y = y; } public void move(int dx, int dy) { erase(); x += dx; y += dy; draw(); } public abstract void draw(); public abstract void erase(); }

4 dIntProg, E05polymorfi.4 Et figurhierarki (2) public class Rectangle extends Shape { private int a, b; public Rectangle(int x, int y, int a, int b) { super(x, y); this.a = a; this.b = b; } public void draw() { Crayon c = new Crayon(); for ( int i=0; i<2; i++ ) { c.move(a); c.turn(90); c.move(b); c.turn(90); }

5 dIntProg, E05polymorfi.5 Et figurhierarki (3) public void run() { Rectangle r = new Rectangle(10, 10, 5, 7); Ellipse e = new Ellipse(5, 5, 3, 7); Shape s; s = r; // legal? s.draw(); s = e; // legal? s.draw(); r = e; // legal? }

6 dIntProg, E05polymorfi.6 Abstrakte og konkrete klasser Klassen Shape giver god mening som superklasse, men instansiering heraf giver ikke mening En sådan klasse kaldes en abstrakt klasse I Java er en klasse abstrakt hvis den erklæres som sådan En ikke-abstrakt klasse kaldes en konkret klasse (en der kan instansieres) En abstrakt klasse kan være “mere eller mindre abstrrakt” –større eller mindre procentdel af metoderne der er abstrakte

7 dIntProg, E05polymorfi.7 Eksempel: redefineret metode public static void run() { Cat garfield = new Cat(); Tiger shereKhan = new Tiger(); Cat c; garfield.hop(); shereKhan.hop(); c = garfield; c.hop(); c = shereKhan; c.hop(); } Cat c Cat hop() Tiger hop()

8 dIntProg, E05polymorfi.8 Eksempel: redefineret metode public static void run() { Cat garfield = new Cat(); Tiger shereKhan = new Tiger(); Cat c; garfield.hop(); shereKhan.hop(); c = garfield; c.hop(); c = shereKhan; c.hop(); } Cat c Cat hop() Tiger hop()

9 dIntProg, E05polymorfi.9 Dynamisk binding (method dispatch) Om typer –Den statiske type er typen der optræder i erklæringen af en variabel (objektreference) –Den dynamiske type er typen af selve objektet Variabler –Den dynamiske type kan være en vilkårlig subtype af den statiske type Metodekald –Den dynamiske type afgør hvilke metoder der bliver kaldt, og denne type er først kendt på kørselstidspunktet (run-time)!

10 dIntProg, E05polymorfi.10 Metodeopslag (method lookup) c.hop() –referencen c følges til objektet –objektets klasse (dynamiske type) bestemmes –hvis metoden hop er (re-)defineret i klassen, benyttes denne implementation –hvis det ikke er tilfældet ledes i superklassen og så fremdeles –den første implementation der findes, er den som udføres Bemærk at vi er sikre på at finde en implementation af metoden på stien fra objektets klasse mod klassen Object. Hvorfor?

11 dIntProg, E05polymorfi.11 Eksempel: heterogen collection public hopAll(Collection coll) { for ( Cat c : coll ) { c.hop(); } Hvilken hop-metode?

12 dIntProg, E05polymorfi.12 Redefinering af metode (specialisering) En metode kan være åben eller lukket (virtual/non-virtual) –i udgangspunktet er alle metoder åbne Hvis en metode er åben, har det to konsekvenser –Metoden kan redefineres i subklasser –Binding af besked til metode foretages først på kørselstidspunktet (dynamic dispatch) Vær omhyggelig ved redefinering af metode –Redefinering foretages ved at specificere præcis samme signatur (metodenavn, formelle parametre og returtype) som i superklassen –ADVARSEL: Hvis signaturen afviger, er der tale om overloading. Der er altså ingen advarsel eller fejlmeddelelse til programmøren i tilfælde af en simpel skrivefejl...

13 dIntProg, E05polymorfi.13 final final-erklæring –lukning –bindingen gøres endelig Variabel –variablen lukkes –bindingen af værdi til variabel er endelig –med andre ord: en final-variabel er en konstant Metode –metoden lukkes –bindingen af signatur til krop (opførsel) er endelig –med andre ord: en final-metode kan ikke redefineres i subklasser Klasse –klassen lukkes –bindingen af subtyper til klassenavnet er endelig –med andre ord: en final klasse kan ikke ”extendes”

14 dIntProg, E05polymorfi.14 Eksempel på final-metode public abstract class Shape { protected int x, y; public Shape(int x, int y) { this.x = x; this.y = y; } public final void move(int dx, int dy) { erase(); x += dx; y += dy; draw(); } public abstract void draw(); public abstract void erase(); };

15 dIntProg, E05polymorfi.15 Sammenfatning Abstrakt metode –Metode uden implementation (krop) Akstrakt metode => abstrakt klasse –Kan ikke instansieres, –men kan være superklasse der samler fælles egenskaber ved subklasser Redefinering af metoder og dynamisk binding –Ved metodekaldet –er det den dynamiske type af objektreferencen r der afgør hvilken metode der udføres, ikke den statiske! r.method(...);


Download ppt "Polymorfi Abstrakte klasser, substitutionsprincippet, statisk og dynamisk type."

Lignende præsentationer


Annoncer fra Google