290 likes | 392 Views
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.
E N D
Indledende ProgrammeringUge 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 • 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 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.
Klasser 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 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
Animal/fox/rabbit hierarkiet Animal agealivelocation act()getAge()setAge()… Rabbit Fox BREEDING_AGE… foodLevel BREEDING_AGE… act()breed()… act()incrementHunger()…
En 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æ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 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() metoden // let all animals act for(Animal animal: animals) animal.act(field, updatedField, newAnimals); } // add new born animals to the list of animals animals.addAll(newAnimals);
En 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 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 Animal public 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 Fox public 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()); } }
Multipel arv draw() act()
Multipel 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
Interface • 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 Actor public 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 interfaces public class Fox extends Animal implements Drawable { ... } public class Hunter implements Actor, Drawable { ... }
Forskal på abstrakte klasser og interfaces • 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 implementering • 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)
Interfaces • 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 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());