De presentatie wordt gedownload. Even geduld aub

De presentatie wordt gedownload. Even geduld aub

Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie.

Verwante presentaties


Presentatie over: "Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie."— Transcript van de presentatie:

1 Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie

2 Inleiding Informatica Prof. Dr. O. De Troyer 2 Voorbeelden n! = 1 n = 0 n! = n * (n -1 )!n > 0 x Y = 1 y = 0, x ≠ 0 x Y = x * x Y-1 y > 0 Recursieve definitie: definitie gegeven in term of zichzelf

3 Inleiding Informatica Prof. Dr. O. De Troyer 3 Recursieve werkwijze Hoe n! berekenen? –Als n = 0 dan is n! gelijk aan 1 –Als n > 0 dan We berekenen eerst (n-1)! We vermenigvuldigen dit resultaat met n Hoe (n-1)! Berekenen? –Zie hierboven! Dus: 4!3!2!1!0! = 1 Berekenen door Hier stoppen we Stop conditie

4 Inleiding Informatica Prof. Dr. O. De Troyer 4 Als n = 0 dan is n! gelijk aan 1 Als n > 0 dan –We berekenen eerst (n-1)! –We vermenigvuldigen dit resultaat met n Java private static int fac( int n) { if (n == 0) return 1; else return n * MijnFac.fac( n-1) ; } n wordt steeds kleiner Hier geen recursie meer. Zorgt ervoor dat de recursieve aanroepen niet oneindig doorgaan Hier geen recursie meer. Zorgt ervoor dat de recursieve aanroepen niet oneindig doorgaan

5 Inleiding Informatica Prof. Dr. O. De Troyer 5 Recursieve methoden ontwerpen Probleem recursief oplossen –Gebruik de oplossing van een kleiner of eenvoudiger probleem om tot de oplossing van het oorspronkelijk probleem te komen Vb. n! = n * (n-1)! –Bepaal de versie van het probleem dat eenvoudig of klein genoeg is om direct op te lossen Dit is de stop conditie Vb. 0! = 1

6 Inleiding Informatica Prof. Dr. O. De Troyer 6 Eenvoudige recursieve patronen Patroon 1 Methode (probleem) if (probleem is eenvoudig) los het op en return oplossing else los deel van het probleem op zodat het kleiner probleem overblijft Methode( kleiner probleem)

7 Inleiding Informatica Prof. Dr. O. De Troyer 7 Eenvoudige recursieve patronen (2) Patroon 2 Methode (probleem) if (probleem is eenvoudig) los het op en return oplossing else oplossing voor kleiner probleem = Methode( kleiner probleem) los probleem gebruik makend van oplossing voor kleiner probleem return oplossing

8 Inleiding Informatica Prof. Dr. O. De Troyer 8 Voordelen Heel wat problemen worden eenvoudiger door gebruik van recursie private int mijnMacht( int x, int y) { int teller, //telt het aantal vermenigvuldigingen resultaat ; //houdt het tussentijdse resultaat van de // vermenigvuldigingen bij resultaat = 1 ; teller = 0 ; while (teller != y) { resultaat *= x ; teller ++ ; } return resultaat ; } private int mijnMacht( int x, int y) { if (y == 0) return 1 ; else return x * mijnMacht( x, y -1) ; } private int mijnMacht( int x, int y) { if (y == 0) return 1 ; else return x * mijnMacht( x, y -1) ; }

9 Inleiding Informatica Prof. Dr. O. De Troyer 9 Efficiënt zoeken in een lijst van elementen Voorwaarde: de elementen in de lijst zijn geordend Werkwijze –Te vergelijken met woord zoeken in woordenboek –Vergelijk element met middelste element Als gelijk dan gevonden en stop Als element “kleiner” dan middelste dan zoek element in eerste helft (op dezelfde wijze) Als element “groter” dan middelste dan zoek element in tweede helft (op dezelfde wijze) –Wordt binair zoeken genoemd

10 Inleiding Informatica Prof. Dr. O. De Troyer 10 Binair zoeken - recursief Zoek element e in array a tussen index begin en index einde: midden = (begin + einde) / 2 Als e = a[midden] dan gevonden zoniet Als e < a[midden] dan zoek e in a tussen begin en midden -1 zoniet // e > a[midden] zoek e in a tussen midden + 1 en einde Stopconditie? begin > einde

11 Inleiding Informatica Prof. Dr. O. De Troyer 11 Binair zoeken - recursief (2) private int bsearch ( int x, int [] a, int begin, int einde) { if begin > einde return -1;// niet gevonden int midden = (begin +einde) / 2 ; // middelste positie if x = a[midden] then return midden; if x < a[midden] return bsearch(x, a, begin, midden -1); if x > a[midden] return bsearch(x, a, midden +1, einde); } Begin: bsearch(x, a, 0, a.length-1)

12 Inleiding Informatica Prof. Dr. O. De Troyer 12 Voorbeeld: De torens van Hanoi Hoe de 7 schijven verplaatsen van toren 1 naar toren 3 onder de volgende voorwaarden: –Een schijf mag nooit bovenop een kleinere schijf –Er kan slechts één schijf te gelijk verplaatst worden –Een schijf moet steeds op een toren liggen –Enkel de bovenste schijf van de toren kan verplaatst worden Toren 1Toren 2Toren 3

13 Inleiding Informatica Prof. Dr. O. De Troyer 13 De torens van Hanoi - oplossing Veronderstel dat we 6 schijven kunnen verplaatsen We verplaatsen die van Toren 1 naar Toren 2 Toren 1Toren 2Toren 3 Toren 2 Toren 3 Toren 1 Dan schijf van Toren 1 naar Toren 3

14 Inleiding Informatica Prof. Dr. O. De Troyer 14 De torens van Hanoi - oplossing (2) Toren 2 Toren 3 Toren 1 Nu verplaatsen de 6 schijven van Toren 2 naar Toren 3. Toren 1Toren 2Toren 3

15 Inleiding Informatica Prof. Dr. O. De Troyer 15 Torens van Hanoi - oplossing (3) Oplossing voor verplaatsen van 7 schijven –Verplaats 6 schijven van toren 1 naar toren 2 –Verplaats schijf 1 van toren 1 naar toren 3 –Verplaats 6 schijven van toren 2 naar toren 3

16 Inleiding Informatica Prof. Dr. O. De Troyer 16 Torens van Hanoi - algemeen Verplaats n schijven van vertrektoren naar eindtoren via een hulptoren –Verplaats n-1 schijven van vertrektoren naar hulptoren –Verplaats 1 schijf van vertrektoren naar eindtoren –Verplaats n-1 schijven van hulptoren naar eindtoren Stop conditie? N = 0 Hulptoren? via begintoren via eindtoren

17 Inleiding Informatica Prof. Dr. O. De Troyer 17 Torens van Hanoi - algemeen (2) Verplaats n schijven van vertrektoren naar eindtoren via een hulptoren Als n > 0 dan –Verplaats n-1 schijven van vertrektoren naar hulptoren via eindtoren –Verplaats 1 schijf van vertrektoren naar eindtoren –Verplaats n-1 schijven van hulptoren naar eindtoren via starttoren

18 Inleiding Informatica Prof. Dr. O. De Troyer 18 Torens van Hanoi - programma Los het probleem op via een Java programma en zorg er voor dat elke verplaatsing van een schijf op het scherm verschijnt.

19 Inleiding Informatica Prof. Dr. O. De Troyer 19 Torens van Hanoi - programma (2) public class Torens { public Torens (int aantalSchijven) { … } public void losop () { … } private void losop ( int aantalSchijven, int van, int naar, int via) { … } private void toonVerplaatsing ( int schijf, int van, int naar) { … } private int schijven ; } private void losop ( int aantalSchijven, int van, int naar, int via) { if (aantalSchijven <= 0 ) return; losop( aantalSchijven - 1, van, via, naar ); toonVerplaatsing (aantalSchijven, van, naar ); losop ( aantalSchijven - 1, via, naar, van); }

20 Inleiding Informatica Prof. Dr. O. De Troyer 20 Torens van Hanoi - programma (3) public Torens (int aantalSchijven) { this.schijven = aantalSchijven ; } public void losop () { losop( schijven, 1, 3, 2) ; } private void toonVerplaatsing ( int schijf, int van, int naar) { System.out.println(“verplaats schijf “ +schijf+” van toren “+van+” naar toren “ + naar ); }

21 Inleiding Informatica Prof. Dr. O. De Troyer 21 Torens van Hanoi - test programma import java.io.*; public class TestTorens { public static void main (String[ ] arg) throws IOException { System.out.println (“ Torens van Hanoi”); System.out.println(“ Voer het aantal schijven in: “); System.out.flush(); BufferedReader keyb = new BufferedReader(new InputStreamReader(System.in)); int aantal ; aantal = Integer.parseInt ( keyb.readLine()) ; Torens torens = new Torens (aantal) ; torens.losop () ; }

22 Inleiding Informatica Prof. Dr. O. De Troyer 22 Torens van Hanoi - test programma Output: Torens van Hanoi Voer het aantal schijven in: 3 verplaats schijf 1 van toren 1 naar toren 3 verplaats schijf 2 van toren 1 naar toren 2 verplaats schijf 1 van toren 3 naar toren 2 verplaats schijf 3 van toren 1 naar toren 3 verplaats schijf 1 van toren 2 naar toren 1 verplaats schijf 2 van toren 2 naar toren 3 verplaats schijf 1 van toren 1 naar toren 3

23 Inleiding Informatica Prof. Dr. O. De Troyer 23 Iteratie en recursie Iteratie kan men omzetten naar recursie while (conditie) body Met variabelen v1, v2, …vN en p1, p2, …, pN Zodat p1, p2, …, pN variabelen zijn waarvan het resultaat niet nodig is na afloop van de lus Deklareer v1, v2, …vN als instantie variabelen private void recursieveWhile ( p1, p2, …pN); if (!conditie) return; body ; recursiveWhile( p1, p2, …, pN); } Deklareer v1, v2, …vN als instantie variabelen private void recursieveWhile ( p1, p2, …pN); if (!conditie) return; body ; recursiveWhile( p1, p2, …, pN); }

24 Inleiding Informatica Prof. Dr. O. De Troyer 24 Voorbeeld private int mijnMacht( int x, int y) { int teller, //telt het aantal vermenigvuldigingen resultaat ; //houdt het tussentijdse resultaat van de // vermenigvuldigingen bij resultaat = 1 ; teller = 0 ; while (teller != y) { resultaat *= x ; teller ++ ; } return resultaat ; } private recursieveMacht (int teller) { if (teller = y) return resultaat *= x ; recursieveMacht(teller ++); } private int resultaat ; private recursieveMacht (int teller) { if (teller = y) return resultaat *= x ; recursieveMacht(teller ++); } private int resultaat ;

25 Inleiding Informatica Prof. Dr. O. De Troyer 25 Nadeel recursie Elke aanroep van de recursieve methode vraag geheugen –voor de private variabelen van de methode –voor de parameters van de methode 1000 aanroepen dan 1000 keer plaats nodig voor deze variabelen en parameters Bij iteratie worden steeds dezelfde variabelen gebruikt lus 1000 keer doorlopen toch maar 1 keer plaats nodig voor de variabelen

26 Inleiding Informatica Prof. Dr. O. De Troyer 26 Keuze tussen iteratie en recursie Eenvoudige problemen, heel veel herhaling –Iteratie Moeilijke problemen, weinig herhaling –Recursie

27 Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 9: Hergebruik

28 Inleiding Informatica Prof. Dr. O. De Troyer 28 Voorbeeld Proffen Studenten Muzikanten naam geboortejaar adres geefLeeftijd + vakken, salaris geefOpslag + studiejaar slagen + instrument reserveer Personen

29 Inleiding Informatica Prof. Dr. O. De Troyer 29 class Persoon { public Persoon (String naam, int geboortejaar) {…} public int geefLeeftijd() { …} public void zetAdres(String adres) { …} private int geboortejaar; private String naam ; private String adres ; } class Prof { public Prof (String naam, int geboortejaar) {…} public int geefLeeftijd() { …} public void zetAdres(String adres) { …} public void geefOpslag( int bedrag) {…} private int geboortejaar; private String naam ; private String adres ; private int salaris; private String vakken ; } Dubbel !

30 Inleiding Informatica Prof. Dr. O. De Troyer 30 Klasse definitie herbruiken class Persoon { public Persoon (String naam, int geboortejaar) {…} public int geefLeeftijd() { …} public void zetAdres(String adres) { …} private int geboortejaar; private String naam ; private String adres ; } class Prof extends Persoon { public void geefOpslag( int bedrag) {…} private int salaris; private String vakken ; } Overerving (“inheritance”) Zorgt er voor dat de klasse Prof automatisch alle instantie variabelen en methoden van de klasse Persoon krijgt.

31 Inleiding Informatica Prof. Dr. O. De Troyer 31 Inheritance class Persoon { public Persoon (String naam, int geboortejaar) {…} public int geefLeeftijd() { …} public void zetAdres(String adres) { …} … } class Prof extends Persoon { public void geefOpslag( int bedrag) {…} … } Alle methoden van Persoon zijn ook methoden voor de klasse Prof Prof p ; … p.zetAdres(“mijn-adres”) ; int l = p.geefLeeftijd() ;

32 Inleiding Informatica Prof. Dr. O. De Troyer 32 Rechtzetting class Persoon { public Persoon (String naam, int geboortejaar) {…} public int geefLeeftijd() { …} public void zetAdres(String adres) { …} private int geboortejaar; private String naam ; private String adres ; } class Prof extends Persoon { public void geefOpslag( int bedrag) {…} private int salaris; private String vakken ; } Door “private” zijn deze instantie variabelen niet toegankelijk in de subklasse! proctected int geboortejaar; protected String naam ; protected String adres ; Oplossing indien toegankelijkheid in subklasse nodig: “Protected”

33 Inleiding Informatica Prof. Dr. O. De Troyer 33 Subklasse en Superklasse class Persoon { public Persoon (String naam, int geboortejaar) {…} public int geefLeeftijd() { …} public void zetAdres(String adres) { …} protected int geboortejaar; protected String naam ; protected String adres ; } class Prof extends Persoon { public void geefOpslag( int bedrag) {…} private int salaris; private String vakken ; } Subklass Superklasse

34 Inleiding Informatica Prof. Dr. O. De Troyer 34 Wijzigingen in de superklasse class Persoon { public Persoon (String naam, int geboortejaar) {…} public int geefLeeftijd() { …} public void zetAdres(String adres) { …} protected int geboortejaar; protected String naam ; protected String adres ; } class Prof extends Persoon { public void geefOpslag( int bedrag) {…} private int salaris; private String vakken ; } protected String straat ; protected int nr; protected String gemeente; protected int postnr ; Subklasse krijgt wijziging automatisch

35 Inleiding Informatica Prof. Dr. O. De Troyer 35 Voordelen gebruik subklassen Vermijdt herhalingen Laat toe om klassen stapsgewijs op te bouwen Persoon Personeelslid AP-lidAssistentProf Lokaliseert wijzigingen Bevordert de uitbreidbaarheid Onderzoeker

36 Inleiding Informatica Prof. Dr. O. De Troyer 36 Inheritance en Constructors class Persoon { public Persoon (String naam, int geboortejaar) { this.naam = naam ; this.geboortejaar = geboortejaar; this.adres = “ “; } … protected int geboortejaar; protected String naam ; protected String adres ; } Zorgt voor initialisatie van class Prof extends Persoon {... private int salaris; private String vakken ; } Prof geboortejaar naam adres salaris vakken De constructor Persoon kan de extra instantie variabelen van Prof niet initialiseren

37 Inleiding Informatica Prof. Dr. O. De Troyer 37 Inheritance en Constructors (2) Prof heeft eigen constructor nodig class Prof extends Persoon { public Prof (String naam, int geboortejaar, int salaris) { this.naam = naam ; this.geboortejaar = geboortejaar; this.adres = “ “ this.salaris = salaris ; } Persoon p = new Persoon(“Jan”, 1960) ; Prof pf = new Prof(“Robert”, 1947, ) ; Prof geboortejaar naam adres salaris vakken

38 Inleiding Informatica Prof. Dr. O. De Troyer 38 Inheritance en Constructors(3) public Prof (String naam, int geboortejaar, int salaris) { super (naam, geboortejaar); this.salaris = salaris ; } class Persoon { public Persoon (String naam, int geboortejaar) { this.naam = naam ; this.geboortejaar = geboortejaar; } … } class Prof extends Persoon { public Prof (String naam, int geboortejaar, int salaris) { this.naam = naam ; this.geboortejaar = geboortejaar; this.salaris = salaris ; … } Doet hetzelfde als de constructor van Persoon Roept de constructor van de superklasse aan

39 Inleiding Informatica Prof. Dr. O. De Troyer 39 Inheritance en Constructors (4) public Prof (String naam, int geboortejaar, int salaris) { super (naam, geboortejaar); this.salaris = salaris ; } Prof geboortejaar naam adres salaris vakken Door super Door Prof zelf Opgelet! –Super moet de eerste instructie zijn!

40 Inleiding Informatica Prof. Dr. O. De Troyer 40 Voorbeeld - subklasse van Name Maak een klasse zoals Name maar die naast voornaam en familienaam ook nog een 2de voornaam bijhoudt. –Klasse ExtendedName

41 Inleiding Informatica Prof. Dr. O. De Troyer 41 Klasse ExtendedName - extra gedrag Naast het gedrag voor Name willen we ook –Naam maken met voornaam, 2de voornaam en familienaam –Geef de eerste letter van de 2de voornaam (als string) Als er geen tweede voornaam is geef dan “NMI” (No Middle Initial) –Geef de naam in titel, voornaam, 2de voornaam en familienaam formaat (als string)

42 Inleiding Informatica Prof. Dr. O. De Troyer 42 ExtendedName vb - Bepaal de interface –Class name: ExtendedName –Constructor: vb: ExtendedName ik = new ExtendedName (“Olga”, “Magdalena”, “De Troyer”);  public void ExtendedName(String first, String middle, String last) vb: ExtendedName ik = new ExtendedName (“Olga”, “De Troyer”);  public void ExtendedName(String first, String last) –Geef initiaal van 2de voornaam: vb: String s = ik.getMiddleInitial();  public String getMiddleInitial() –Geef titel, voornaam, 2de voornaam, familienaam: vb: String s = ik.getFormalName();  public String getFornalName()

43 Inleiding Informatica Prof. Dr. O. De Troyer 43 ExtendedName vb - Klasse skelet class ExtendedName extends Name{ // extra instantie variabele private String middleName; public ExtendedName( String first, String middle, String last ) { statements } public ExtendedName( String first, String last ) { statements } // geef initiaal van de 2de voornaam public String getMiddleInitial( ) { statements } // geef title, voornaam, 2de voornaam, familienaam public String getFormalName( ) { statements } }

44 Inleiding Informatica Prof. Dr. O. De Troyer 44 ExtendedName vb - Implementatie (1) class ExtendedName extends Name{ // extra instantie variabele private String middleName; public ExtendedName( String first, String middle, String last ) { super( first, last) ; this.middleName = middle ; } public ExtendedName( String first, String last ) { super( first, last) ; this.middleName = “” ; } // geef initiaal van de 2de voornaam public String getMiddleInitial( ) { if (! middleName.equals(“ “) return middleName.substring(0,1) ; else return(“NMI”) ; } // geef title, voornaam, 2de voornaam, familienaam public String getFormalName( ) { return title + “ “ + firstName + “ “ + middleName + “ “ + lastName ; } }

45 Inleiding Informatica Prof. Dr. O. De Troyer 45 ExtendedName vb - Implementatie (2) Instantie variabelen van Name moeten protected worden class Name {... // instantie variabelen protected String firstName; protected String lastName; protected String title ; }

46 Inleiding Informatica Prof. Dr. O. De Troyer 46 Subklassen en Toekenningen Een object van een subklasse kan overal worden gebruikt waar een object van de superklasse is toegelaten Name naam ; ExtendedName naamJef = new ExtendedName(“Jef”, “Piet”, “Verelst”); naam = naamJef; Niet toegelaten: Name naamJan = new Name(“Jan”, “Janssens”); ExtendedName eNaam ; eNaam = naamJan;

47 Inleiding Informatica Prof. Dr. O. De Troyer 47 Subklassen en Toekenningen (2) Maar! –Een object van een subklasse kan zich in de context van een superklasse object enkel als een superklasse object gedragen Name naam ; ExtendedName naamJef = new extendedName(“Jef”, “Piet”, “Verelst”); naam = naamJef; naam.getInitials() ; Niet toegelaten: naam.getFormalName() ;

48 Inleiding Informatica Prof. Dr. O. De Troyer 48 Compositie versus Inheritance class Name2 { public Name2( String first, String middle, String last ) {...} public String getMiddleInitial( ) { … } public String getFormalName( ) { … } // instantie variabele private Name n; private String middleName; } Bevat een referentie naar een Name object Name2 erft niet de instantie variabelen en methoden van Name object n Name2 n middleName ExtendedName firstName lastName title middleName Via Inheritance Compositie

49 Inleiding Informatica Prof. Dr. O. De Troyer 49 Compositie versus Inheritance (2) class Name2 { public Name2( String first, String middle, String last ) { n = new Name(first, last); this.middleName = middle ; } … } Name2 n2 = new Name2(“Jana”, “Jeanne”, “Bens”) ; n2.getInitials() ; Fout! Geen methode van Name2 Fout! Geen methode van Name2

50 Inleiding Informatica Prof. Dr. O. De Troyer 50 Compositie versus Inheritance (3) Compositie modelleert een “heeft-een”- relatie (“has-a”) –Een fiets heeft een wiel –Een persoon heeft een naam Inheritance modelleert een “is-een” relatie (“is-a”) –Een deeltijdse werknemer is een werknemer –Een kat is een dier Combinatie van compositie en inheritance kan –Een fiets is een voertuig en heeft een wiel –Een wiel is een onderdeel

51 Inleiding Informatica Prof. Dr. O. De Troyer 51 Klasse hiërarchie Een subklasse kan zelf ook subklassen hebben Persoon Personeelslid AP-lid AssistentProf Een klasse kan meerdere subklassen hebben

52 Inleiding Informatica Prof. Dr. O. De Troyer 52 De klasse Object Alle klassen in Java zijn direct of indirect een subklasse van de klasse Object Object is de top van de klasse hiërarchie. Object

53 Inleiding Informatica Prof. Dr. O. De Troyer 53 Methoden overschrijven Sommige methoden die een subklasse erft van zijn superklasse, zijn niet (helemaal) geschikt –Vb: getInitials voor ExtendedName Oplossing –Vervang definitie van getInitials voor ExtendedName class ExtendedName extends Name{... public String getInitials() { return firstName.substring(0,1)+”.” + middleName.substring(0,1)+”.” + lastName.substring(0,1) ; }... }

54 Inleiding Informatica Prof. Dr. O. De Troyer 54 Methoden overschrijven (2) Deze techniek noemt men “overriding” –Het her-implementeren van een methode geërfd van een superklasse in een subklasse –De signatuur van de methode blijft dezelfde. De methode in de superklasse blijft ongewijzigd –getInitials voor Name -object, definitie uit Name klasse –getInitials voor ExtendedName -object, definitie uit ExtendedName klasse

55 Inleiding Informatica Prof. Dr. O. De Troyer 55 Methoden overschrijven (3) Welke methode wordt uitgevoerd? Name n = new Name (“Peter”, “Peters”) ; ExtendedName en = new ExtendedName (“Jan”, “Peter”, “Claessen”) ; String initials ; initials = n.getInitials() ; initials = en.getInitials() ; Name n = new ExtendedName (“Tom”, “Luc”, “Janssens”) ; initials = n.getInitials() ; n = new Name (“Peter”, “Peters”) ; initials = n.getInitials() ; Het zoeken naar de juiste methode begint in de klasse van het object getInitials uit de klasse Name getInitials uit de klasse ExtendedName getInitials uit de klasse Name

56 Inleiding Informatica Prof. Dr. O. De Troyer 56 Het zoeken naar de juiste methode Object... bericht object klasse Super-klasse

57 Inleiding Informatica Prof. Dr. O. De Troyer 57 Overschrijven versus overladen Overladen (“overloading”) –Naam van de methoden is dezelfde –Signatuur van de methoden is verschillend Laat toe om dezelfde naam voor verschillende methoden te gebruiken Welke methode gebruikt wordt bepaald door de aanroep Overschrijven (“overriding”) –Naam en signatuur van de methode is dezelfde Laat toe methode te herdefiniëren Welke methode gebruikt wordt bepaald bij uitvoering

58 Inleiding Informatica Prof. Dr. O. De Troyer 58 Methode voor de klasse Object public boolean equals(Object o) ; - laat toe te testen wanneer twee objecten gelijk zijn –moet in elke nieuwe klasse her geïmplementeerd worden (indien nodig) (overriding) Zoniet enkel true indien hetzelfde object Voorbeeld: class Name { public boolean Equals (Object o) { Name n = (Name) o ; return this.firstName.equals(n.firstName) && this.lastName.equals(n.lastName) && this.title.equals(n.title) }

59 Inleiding Informatica Prof. Dr. O. De Troyer 59 Equals voorbeeld Zonder equals definitie voor Name Name n1 = new Name(“Piet”, “Janssens”) ; Name n2 = new Name(“Piet”, “Janssens”) ; n1.equals(n2) ; n2 = n1 ; n1.equals(n2) ; false true Met gegeven equals definitie voor Name –Beide true

60 Inleiding Informatica Prof. Dr. O. De Troyer 60 Superklasse voor gemeenschappelijke eigenschappen Voorbeeld –Stockbeheer Fototoestellen: identificatie nr, beschrijving, hoeveelheid in stock, prijs, met of zonder lens, maximale sluitingssnelheid Lenzen: identificatie nr, beschrijving, hoeveelheid in stock, prijs, zoom-mogelijkheid, bereik Film: identificatie nr, beschrijving, hoeveelheid in stock, prijs, asa, aantal opnamen

61 Inleiding Informatica Prof. Dr. O. De Troyer 61 Superklasse voor gemeenschappelijke eigenschappen (2) Fototoestellen: identificatie nr, beschrijving, hoeveelheid in stock, prijs, met of zonder lens, maximale sluitingssnelheid Lenzen: identificatie nr, beschrijving, hoeveelheid in stock, prijs, zoom-mogelijkheid, bereik Film: identificatie nr, beschrijving, hoeveelheid in stock, prijs, asa, aantal opnamen Gemeenschappelijke eigenschappen in een superklasse Klasse StockItem: identificatie nr, beschrijving, hoeveelheid in stock, prijs

62 Inleiding Informatica Prof. Dr. O. De Troyer 62 Superklasse voor gemeenschappelijke eigenschappen (3) class StockItem { public StockItem (…) {…} public String getBeschrijving () {…} public int getAantal () {…} public int getPrijs () {…} String beschrijving; protected int identificatieNr ; protected int hoeveelheid ; protected int prijs ; } class Lens extends StockItem { … private boolean metZoom ; private int maxbereik ; } class Film extends StockItem { … private int asa ; private int aantalOpnamen ; } class Fototoestel extends StockItem { … boolean metLens ; private int maxSluiting ; private String kleur ; }

63 Inleiding Informatica Prof. Dr. O. De Troyer 63 Abstracte methoden Voorbeeld –We willen een methode print die per stock item alle gegevens afdrukt Print methode is gemeenschappelijke methode Maar Print implementatie is verschillend voor fototoestel, lens en film –Print als methode in superklasse StockItem –Elke subklasse overschrijft de print methode –Maar! Wat is de implementatie van print voor de klasse StockItem ?

64 Inleiding Informatica Prof. Dr. O. De Troyer 64 Abstracte methoden (2) Methode print in de klasse StockItem enkel met als doel gemeenschappelijk gedrag van de subklassen vast te leggen –Wordt abstracte methode genoemd abstract void print () ; Een klasse met één of meerdere abstracte methoden is een abstracte klasse abstract class StockItem { … abstract void print () ; –Men kan geen objecten creëren van een abstracte klasse Namelijk de klasse is onvolledig gespecificeerd

65 Inleiding Informatica Prof. Dr. O. De Troyer 65 Voorbeeld abstracte klasse public abstract class StockItem { public StockItem (…) {…} public String getBeschrijving () {…} public int getAantal () {…} public int getPrijs () {…} public abstract void print () ; protected String beschrijving; protected int identificatieNr ; protected int hoeveelheid ; protected int prijs ; } class Fototoestel extends StockItem { … public void print () { … } ; private boolean metLens ; private int maxSluiting ; private String kleur ; } class Lens extends StockItem { … public void print () { … } ; private boolean metZoom ; private int maxbereik ; } class Film extends StockItem { … public void print () { … } ; private int asa ; private int aantalOpnamen ; }

66 Inleiding Informatica Prof. Dr. O. De Troyer 66 Voorbeeld abstracte klasse (2) StockItem item ; item = new StockItem() ; … item.print ; item = new Fototoetstel (…) ; … item.print ; item = new Lens(…) ; … item.print ; item = new Film(…); … item.print ; Fout Print is gedefinieerd voor StockItem

67 Inleiding Informatica Prof. Dr. O. De Troyer 67 Abstracte klassen Een abstracte klasse kan zelf abstracte klassen als subklassen hebben cirkel rechthoekdriehoek Figuur veelhoek

68 Inleiding Informatica Prof. Dr. O. De Troyer 68 Abstracte methode voor de klasse Object public String toString() ; - maakt een String representatie van het object –moet in elke nieuwe klasse geïmplementeerd worden (indien nodig) Voorbeeld : class Name { public String toString() { return (firstName + lastName); }

69 Inleiding Informatica Prof. Dr. O. De Troyer 69 Abstracte methoden zonder subklassen Een interface is een soort klasse die enkel een aantal abstracte methoden specificeert Elke klasse die deze interface implementeert moet deze methoden voorzien Er is hier geen sprake van inheritance

70 Inleiding Informatica Prof. Dr. O. De Troyer 70 Interface - voorbeeld interface Movable { boolean start (); void stop () ; boolean turn (int degrees) ; boolean changeSpeed (double kmPerHour); } declareert de minimale methoden voor “movable” objects class Plane implements Movable { boolean start () {... }; void stop () {... }; boolean turn (int degrees) {... }; boolean changeSpeed (double kmPerHour) {... };... }

71 Inleiding Informatica Prof. Dr. O. De Troyer 71 Interface en subklasse Klasse kan tegelijkertijd een interface implementeren en een subklasse zijn class Plane extends Vehicle implements Movable {... }


Download ppt "Inleiding Informatica Prof. Dr. O. De Troyer Hoofdstuk 8: Recursie."

Verwante presentaties


Ads door Google