November 2001Eiffel sessie 1p. 1 OBJECTGERICHT PROGRAMMEREN Elk object behoort tot een klasse REKENING rek01 rek02 PRODUCT prod01 prod02 prod03
November 2001Eiffel sessie 1p. 2 class TELLER creation maken feature waarde : INTEGER feature maken is … feature verhogen is … feature verlagen is … feature terugzetten is … end -- class TELLER klassetekst naam van de klasse hoe wordt een object gecreëerd? attributen : wat onthouden? (statisch) diensten : wat doen? (dynamisch)
November 2001Eiffel sessie 1p. 3 Attributen (variabelen) feature nummer : INTEGER bedrag : REAL resultaat : DOUBLE letter : CHARACTER aanwezig : BOOLEAN naam : STRING student1 : STUDENT aantal : INTEGER is 8 voorgedefineerde klassen constante
November 2001Eiffel sessie 1p. 4 Diensten (procedures) feature naam is do instructies end -- naam feature naam (parameter : CLASS) is do instructies end -- naam
November 2001Eiffel sessie 1p. 5 feature naam (parameter : CLASS1) : CLASS2 is do … Result := instructie end -- naam Functie !! Result is van de klasse CLASS2
November 2001Eiffel sessie 1p. 6 Instructies: invoer/uitvoer io.readint, io.readreal, io.readchar, io.readline io.putint( ), io.putreal( ), io.putchar( ), io.putstring( ), io.putdouble( ) !!tussen haakjes staat object of waarde van het type integer, real, character of string vb. io.putint(45) io.putreal(bedrag) io.lastint, io.lastreal, io.lastcharacter, io.laststring
November 2001Eiffel sessie 1p. 7 io.new_line vb. io.putstring(“Geef je naam : ”) io.readline io.new_line io.putstring(io.laststring)
November 2001Eiffel sessie 1p. 8 Instructies : verwerking toewijzingsopdracht := vb. nummer := 3 nummer1 := nummer2 bewerkingen : afhankelijk van het type (klasse) van de variabele rekenkundige bewerkingen : integer : +, -, *, //, \\ real : +, -, *, /, ^ boolean : and, or, xor, not vb. nummer := nummer * 8
November 2001Eiffel sessie 1p. 9 vergelijkingsoperatoren : =,, =, /= vb. aanwezig := teller /= 0 Vergelijk met := voor toewijzing
November 2001Eiffel sessie 1p. 10 Oefening : Stel een klassetekst op voor REKENING. Een rekening moet kunnen worden geopend, waarbij ze een nummer krijgt toegewezen. Het saldo moet bij het openen uiteraard gelijk zijn aan nul. Van de rekening moet geld kunnen worden afgehaald en er moet geld kunnen worden op gestort. Bij het afsluiten van de rekening wordt het saldo weer op nul gezet.
November 2001Eiffel sessie 1p. 11 class REKENING creation open feature … feature open (nr_in : INTEGER) is do … end -- open feature … end -- class REKENING waarde wordt bij het aanroepen van de procedure doorgegeven
November 2001Eiffel sessie 1p. 12 class REKENING creation open feature nummer : INTEGER saldo : REAL feature open (nr_in : INTEGER) is do nummer := nr_in end -- open feature afhalen (bedrag : REAL) is do saldo := saldo - bedrag end -- afhalen feature storten (bedrag : REAL) is do saldo := saldo + bedrag end -- storten feature afsluiten is do saldo := 0 end -- afsluiten end -- class REKENING class BANK creation open feature rek1, rek2 : REKENING feature open is do create rek1.open(11111) create rek2.open(22222) rek1.storten(10000) rek2.storten(5000) rek1.afhalen(4000) toon_saldo(rek1) toon_saldo(rek2) end -- open feature toon_saldo (rek_in : REKENING) is do io.putstring(“het saldo van rekening ”) io.putint(rek_in.nummer) io.putstring(“ bedraagt ”) io.putreal(rek_in.saldo) end -- toon_saldo end -- class BANK -- Uitvoerlogica -- in een aparte dienst --Objecten van REKENING creëren --Diensten van deze objecten aanspreken
November 2001Eiffel sessie 1p. 13 Expansieklassen en -objecten (enkelvoudige klassen) - gebruiker moet geen klassetekst schrijven - automatische creatie met default- waarde - inhoud van expansie-object kan door elk ander object gewijzigd worden zonder te “vragen” - expansie-object bevat een waarde; elke copie dmv toewijzing resulteert in een fysische copie - INTEGER, REAL, DOUBLE, BOOLEAN, CHARACTER Referentieklassen en -objecten (samengestelde klassen) - gebruiker moet zelf klassetekst schrijven (uitz. STRING) - creatie moet expliciet gebeuren - inhoud van expansie-object kan niet rechtstreeks door ander object gewijzigd worden; het andere object moet beroep doen op de diensten van het referentie-object - expansie-object bevat een ‘referentie’ (pointer); een copie dmv toewijzing bevat enkel de referentie naar eenzelfde fysische plaats - STRING, alle zelf ontworpen klassen
November 2001Eiffel sessie 1p. 14 expansieklasse referentieklasse declaratie en creatie van objecten i, j : INTEGER i : j : 0 0 rek1 : REKENING void rek1 : create rek1.open(11111) nummer saldo rek1 :
November 2001Eiffel sessie 1p. 15 expansieklasse referentieklasse toewijzing i, j : INTEGER i := 10 j := i i : j : 0 0 i : j : 10 rek1, rek2 : REKENING create rek1.open(11111) create rek2.open(22222) rek1 : rek2 : nummer saldo nummer saldo rek2 := rek1
November 2001Eiffel sessie 1p. 16 Kloneren (clone) rek2 := clone(rek1) rek1 : rek2 : nummer saldo nummer saldo ! geen voorafgaande create nodig rek2 := rek1
November 2001Eiffel sessie 1p. 17 rek1 : rek2 : nummer saldo nummer saldo datum dag maand jaar datum dag maand jaar deep_clone rek2 := clone(rek1)rek2 := deep_clone(rek1)
November 2001Eiffel sessie 1p. 18 Vergelijken van objecten rek1 = rek2rek1.is_equal(rek2)rek1.is_deep_equal(rek2) equal(rek1,rek2)deep_equal(rek1,rek2) rek1 : rek2 : nummer saldo nummer saldo datum dag maand jaar datum dag maand jaar FALSE TRUE
November 2001Eiffel sessie 1p. 19 Oefening 4 p Schrijf een klassetekst voor de klasse PRODUCT. Producten hebben een productnummer (geheel getal), en een voorraad (geheel getal). Bij de creatie van een product moet het nummer en de beginvoorraad worden aangegeven. Als een product wordt besteld, stijgt de voorraad; als een product wordt geleverd, daalt de voorraad. 2. Schrijf de instructies om prod01 (met productnr 110 en beginvoorraad 500 stuks) te maken, en prod02 (met productnr 215 en beginvoorraad 1500 stuks). Bestel vervolgens 200 stuks van product 1 en lever 500 stuks van product 2. Toon van beide producten de nieuwe voorraad.
November 2001Eiffel sessie 1p. 20 classPRODUCT creation make feature prodnr : INTEGER voorraad : INTEGER feature make (nr_in, vr_in : INTEGER) is do prodnr := nr_in voorraad := vr_in end -- make feature bestellen (hoeveelheid : INTEGER) is do voorraad := voorraad + hoeveelheid end -- bestellen feature leveren (hoeveelheid : INTEGER) is do voorraad := voorraad - hoeveelheid end -- leveren end -- class PRODUCT
November 2001Eiffel sessie 1p. 21 class PRODUCTBEHEER creation make feature prod01, prod02 : PRODUCT feature make is do create prod01.make(110, 500) create prod02.make(215, 1500) prod01.bestellen(200) prod02.leveren(500) io.putstring("Van produkt 110 bedraagt de voorraad ") io.putint(prod01.voorraad) io.putstring(" stuks.") io.new_line io.putstring("Van produkt 215 bedraagt de voorraad ") io.putint(prod02.voorraad) io.putstring(" stuks.") end -- make end -- class PRODUCTBEHEER
November 2001Eiffel sessie 1p. 22 Oefening 4 p Maak een systeempje aan voor het beheer van een boerderij met 3 varkens. Een varken krijgt bij aanschaf een naam, een gewicht en een leeftijd toegekend. Wanneer een varken gevoederd wordt, neemt zijn gewicht toe met 1/10de van de hoeveelheid voer. Elke maand wordt de leeftijd van het varken (in maanden uitgedrukt) aangepast. Een varken kan bovendien een willekeurig geluid produceren (toon op het scherm). Schrijf de tekst voor de klasse VARKEN. 2. In de coördinatorklasse worden eerst 3 varkens gecreëerd. Het beheer van de boerderij houdt in dat we varkens voederen, en de leeftijd ervan aanpassen. De klasse moet toelaten een bepaald geluid te kiezen en dit door een varken te laten produceren. Tenslotte wordt ook de gemiddelde leeftijd en het gemiddelde gewicht van de varkens getoond.
November 2001Eiffel sessie 1p. 23 Class VARKEN creation aanschaf feature naam : STRING leeftijd : INTEGER gewicht : REAL feature aanschaf (naam_in : STRING; lt_in : INTEGER; gew_in : REAL) is do naam := clone(naam_in) leeftijd := lt_in gewicht := gew_in end -- aanschaf 1/2
November 2001Eiffel sessie 1p. 24 feature jarig is do leeftijd := leeftijd + 1 end -- jarig feature voederen (kilo : REAL) is do gewicht := gewicht + kilo/10 end -- voederen feature zing (lawaai : STRING) is do io.new_line io.putstring(lawaai) io.putstring(" -- ") io.putstring(lawaai) io.putstring(" !!") io.new_line end -- zing end -- class VARKEN 2/2
November 2001Eiffel sessie 1p. 25 Class BOERDERIJ1/3 creation ________ feature _____, _____, _____ : ______ geluid : _____ feature ______ is do io.putstring("Welkom op de boerderij !") io.new_line create __________________________________ beheer toon_gegevens end -- _______
November 2001Eiffel sessie 1p. 26 Class BOERDERIJ creation maken feature vark1, vark2, vark3 : VARKEN geluid : STRING feature maken is do io.putstring("Welkom op de boerderij !") io.new_line create vark1.aanschaf("Babe",0,5.2) create vark2.aanschaf("Pigglet",2,15) create vark3.aanschaf("Miss Piggy",10,80) beheer toon_gegevens end -- maken 1/4
November 2001Eiffel sessie 1p. 27 feature beheer is2/3 do vark1.jarig --varken 1 is jarig kies_geluid _________________ --varken 1 maakt gekozen geluid _________________ --varken 2 krijgt 2 kg voer _________________ --varken 3 krijgt 10 kg voer end -- beheer feature kies_geluid is do io.new_line io.putstring(_____________________) io.readline geluid := ______________________ end -- kies_geluid
November 2001Eiffel sessie 1p. 28 feature beheer is do vark1.jarig kies_geluid vark1.zing(geluid) vark2.voederen(2) vark3.voederen(10) end -- beheer feature kies_geluid is do io.new_line io.putstring("Wat zegt het varken ? ") io.readline geluid := clone(io.laststring) end -- kies_geluid 2/4
November 2001Eiffel sessie 1p. 29 feature toon_gegevens is3/3 do io.new_line io.putstring("De varkens zijn gemiddeld ") io.putreal(________) io.putstring(" maanden oud.") io.new_line io.putstring("De varkens wegen gemiddeld ") io.putreal(________) io.putstring(" kilo.") io.readline end -- toon_gegevens feature gem_lt : REAL is do ________ := ____________________________________________ end -- gem_lt feature gem_gew : REAL is do ________ := ____________________________________________ end -- gem_gew end -- class BOERDERIJ
November 2001Eiffel sessie 1p. 30 feature toon_gegevens is do io.new_line io.putstring("De varkens zijn gemiddeld ") io.putreal(gem_lt) io.putstring(" maanden oud.") io.new_line io.putstring("De varkens wegen gemiddeld ") io.putreal(gem_gew) io.putstring(" kilo.") io.readline end -- toon_gegevens feature gem_lt : REAL is do Result := (vark1.leeftijd + vark2.leeftijd + vark3.leeftijd)/3 end -- gem_lt 3/4
November 2001Eiffel sessie 1p. 31 feature gem_gew : REAL is do Result := (vark1.gewicht + vark2.gewicht + vark3.gewicht)/3 end -- gem_gew end -- class BOERDERIJ 4/4