indledende programmering uge 8 - efterår 2006
DESCRIPTION
Indledende Programmering Uge 8 - Efterår 2006. Mere om abstraktioner Susanne Lindros. Plan for i dag. Computer simulationer Abstrakte klasser og metoder Multipel vs. simpel arv Java Interfaces Gennemgående eksempel Foxes-and-Rabbits. Computer simulationer. - PowerPoint PPT PresentationTRANSCRIPT
Indledende ProgrammeringIndledende Programmering Uge 8 - Efterår 2006Uge 8 - Efterår 2006
Mere om abstraktionerMere om abstraktionerSusanne LindrosSusanne Lindros
Plan for i dagPlan for i dag
• Computer simulationer
• Abstrakte klasser og metoder
• Multipel vs. simpel arv
• Java Interfaces
• Gennemgående eksempel Foxes-and-Rabbits
Computer simulationerComputer simulationer• Programmer der simulerer aktiviteter i den
virkelige verden• Som regel forenklinger af virkeligheden pga.
begrænsede resourcer og uklare regler• Bruges bl.a. til
– Forudsigelser: Hvordan bliver vejret i morgen– Eksperimenter der er svære/umulige at gennemføre i
den virkelige verden: Hvad vil der ske hvis vi gør ...
• Simuleringen kan ofte styres med parametre, der kan ”skrues op og ned på”
Foxes-and-rabbits simulationenFoxes-and-rabbits simulationen• En rovdyr – byttedyr simulation
• En balanceakt:– Mange byttedyr giver mange rovdyr– Mange rovdyr spiser mange byttedyr– Færre byttedyr betyder mindre mad til rovdyr– Mindre mad betyder færre rovdyr– Færre rovdyr betyder flere byttedyr– osv.
Foxes-and-rabbits simulationenFoxes-and-rabbits simulationen
Foxes-and-rabbits simulation V1Foxes-and-rabbits simulation V1
Klasser i version1Klasser i version1• Fox, forsimplet model af et rovdyr• Rabbit, forsimplet model af et byttedyr• Simulator, styrer simulationen og holder styr på
samlingen af ræve og kaniner• Field, repræsenterer et 2D areal• Location, repræsenterer en position i et Field• SimulatorView, præsenterer et view af et Field• FieldStats, Counter, vedligeholder statistik
Superklassen AnimalSuperklassen Animal• Alle dyr har en alder og en position
• Alle dyr kan blive født, leve og dø
• Alle dyr kan flytte sig til en ny position
• Alle dyr kan handle, men de gør det forskelligt alt efter hvem de er:– Ræve går på jagt efter kaniner– Kaniner render forvirrede rundt
Foxes-and-rabbits simulation V2Foxes-and-rabbits simulation V2
Animal/fox/rabbit hierarkietAnimal/fox/rabbit hierarkietAnimal
agealivelocation
act()getAge()setAge()…
Rabbit
BREEDING_AGE…
act()breed()…
Fox
foodLevel
BREEDING_AGE…
act()incrementHunger()…
En kanins adfærdEn kanins adfærd• Styres af act() metoden
• Alderen øges I hvert simulations trin– Alle dør ved samme alder
• Kaniner der er gamle nok kan føde i hvert simulations trin – vi har kun hunkaniner
• Kaniner prøver at gå til et nabofelt
• Kaniner dør hvis der er overbefolket
En rævs adfærdEn rævs adfærd• Styres af act() metoden• Alderen øges i hvert simulations trin
– Alle dør ved samme alder
• Sulten øves i hvert simulations trin• Ræve der er gamle nok kan føde i hvert
simulations trin – vi har kun hunræve• Ræve leder efter mad (kaniner) i deres
nabolokationer• Ræve forsøger at gå til nabofelt• Ræve kan dø af sult eller af overbefolkning
Simulator klassenSimulator klassen• Populate() metoden
– Opretter alle dyr og giver dem en tilfældig startalder
• simulateOneStep() metoden– Itererer over populationen– Kalder act() på alle dyr– Tilføjer nyfødte dyr til populationen– Arbejder med to felter: field og updatedField– Viser den opdaterede population
simulateOneStep() metodensimulateOneStep() metoden
// let all animals actfor(Animal animal: animals)
animal.act(field, updatedField, newAnimals);}
// add new born animals to the list of animalsanimals.addAll(newAnimals);
En abstrakt klasseEn abstrakt klasse• En superklasse der
– Anvendes til at repræsentere fælles egenskaber for subklasserne i et hierarki
– Anvendes til at give subklasserne i et hierarki en fælles grænseflade
– Anvendes for at kunne anvende polymorfe metoder på subklasserne
– Ikke kan instantieres
• Defineres med nøgleordet abstract foran klassedefinitionen
Abstrakte metoderAbstrakte metoder• En abstrakt klasse indeholder ofte
abstrakte metoder, dvs. metoder der ikke er implementeret i superklassen
• Abstrakte metoder:– Har kun et hoved - ingen krop– Skal implementeres i subklasserne hvis disse
ikke også skal blive abstrakte– Defineres med abstract foran
metodeerklæringen
Den abstrakte klasse AnimalDen abstrakte klasse Animalpublic abstract class Animal { private int age; private boolean alive; private Location location; abstract public void act(
Field currentField, Field updatedField, List<Animal> newAnimals); public void setDead() {alive = false;} ...}
Den konkrete klasse FoxDen konkrete klasse Foxpublic class Fox extends Animal { public void act(Field currentField,
Field updatedField, List<Animal> newAnimals){
… // Move towards the source of food Location newLocation =
findFood(currentField, getLocation()); if(newLocation == null) { // no food found - move randomly newLocation = updatedField.freeAdjacentLocation( getLocation()); }}
Flere abstrationerFlere abstrationer
Multipel arvMultipel arv
draw() act()
Multipel arvMultipel arv• En klasse arver fra flere direkte superklasser
f.eks. ”class Hjælpelærer extends Underviser, Studerende”
• Komplekst at anvende og ofte ikke nødvendigt – mange fejlmuligheder
• Nogle sprog tillader det (f.eks. C++)• I Java kan man kun anvende simpel arv mellem
klasser• I Java kan man anvende multiple arv mellem
interfaces
InterfaceInterface
• Hidtil: En uformel beskrivelse af hvordan en klasse anvendes– Ofte javadoc dokumentation
• Nu også: Et sprogelement i java, der svarer til en abstrakt klasse, hvor alle metoder er abstrakte
(ikke implementerede)
Interfacet Interfacet ActorActorpublic interface Actor{ /** * Perform the actor's daily behavior. * Transfer the actor to updatedField if it is * to participate in further steps of the simulation. * @param currentField The current state of the * field. * @param location The actor's location in the field. * @param updatedField The updated state of the * field. */ void act(Field currentField, Location location, Field updatedField);}
Klasser der implementerer Klasser der implementerer interfacesinterfaces
public class Fox extends Animal implements Drawable{ ...}
public class Hunter implements Actor, Drawable{ ...}
Forskal på abstrakte klasser og Forskal på abstrakte klasser og interfacesinterfaces
• Abstrakte klasser:– Kan både indeholde abstrakte og ikke
abstrakte (implementerede) metoder– Kan definere instansvariabler/felter
• Interfaces– Kan ikke indeholde implementation– Kan kun definere konstanter– Understøtter multipel arv Tommelfingerregel: brug
interfaces hvis det er muligt – og kun abstrakte klasser i de øvrige tilfælde
Opsummering af arv og Opsummering af arv og implementeringimplementering
• Klasser kan arve andre klasser med simpel arv(eks.: K2 extends K1)
• Klasser kan implementere vilkårligt mange interfaces(eks.: K2 implements I1, I2, I3)
• Disse 2 muligheder kan kombineres(eks.: K2 extends K1 implements I1, I2, I3)
• Interfaces kan arve vilkårligt mange interfaces (eks.: I4 extends I1, I2, I3)
• Alle andre kombinationsmuligheder er ulovlige(eks.: Interfaces kan ikke implementere interfaces)
InterfacesInterfaces• Anvendes til
– Definere et ensartet interface til mange klasser (fælles datatype)
– Muliggøre uafhængig implementation af systemets dele
– Muliggøre udskiftning af implementation uden at ændre interfacet
– Realisere multipel arv• Bortset fra det sidste punkt gælder det samme
for abstrakte klasser – men interfaces giver et ”renere snit” fordi de ikke kan indeholde implementerede metoder
Interfaces i Collection frameworketInterfaces i Collection frameworket
Interfaces som typerInterfaces som typer
• Klasser der implementerer et interface er subtyper af interface typen
• Dvs. polymorfi kan anvendes på både interfaces og klasser
List<Animal> list = new ArrayList<Animal>();
list.add(new Fox());