Forelæsning Uge 12 Mandag

Relaterede dokumenter
Forelæsning Uge 12 Torsdag

Har kun én enkelt abstract metode De steder, hvor man skal bruge et objekt, hvis type er et funktionelt interface, kan man i stedet bruge en lambda

Har kun én enkelt abstract metode De steder, hvor man skal bruge et objekt, hvis type er et funktionelt interface, kan man i stedet bruge en lambda

Forelæsning Uge 6 Mandag

Forelæsning Uge 5 Mandag

Forelæsning Uge 5 Mandag

Forelæsning Uge 5 Mandag

Forelæsning Uge 11 Torsdag

Forelæsning Uge 11 Mandag

Forelæsning Uge 5 Mandag

Forelæsning Uge 11. Nedarvning. Object klassen. Projektopgave om computerspil

COMPUTERSPIL 1. Opgave 1. Opgave 2

Forelæsning Uge 11. Nedarvning. Object klassen. Projektopgave om computerspil

COMPUTERSPIL 1. Opgave 1

Ugeseddel 4 1. marts - 8. marts

Datalogi OB, Efterår 2002 OH er, forelæsning 10/ Klasser og nedarvning

dintprog Manual Revision: 1241 August 24, 2010 I Introduktion 3 1 Notation 3 II Begreber 4 2 Grundbegreber om programmering 4

Forelæsning Uge 3 Mandag

Forelæsning Uge 4 Torsdag

Konstruktion af grafiske brugergrænseflader (GUI'er)

Polymorfi. Arv (inheritance) Abstrakte klasser, substitutionsprincippet, overriding, statisk og dynamisk type. Coercion

Forelæsning Uge 2 Mandag

Forelæsning Uge 4 Mandag

Forelæsning Uge 2 Torsdag

Forelæsning Uge 6 Mandag

Software Construction 1 semester (SWC) Spørgsmål 1

Forelæsning Uge 2 Mandag

DANMARKS TEKNISKE UNIVERSITET

Klasser og objekter. (Afsnit i manualen)

Klasser og nedarvning

Forelæsning Uge 6 Mandag

Forelæsning Uge 3 Torsdag

Kursus i OOP og Java. Kursus i Objektorienteret programmering i Java

Forelæsning Uge 3 Torsdag

Forelæsning Uge 10 Torsdag

Tree klassen fra sidste forelæsning

b) Udvid din implementation af forme til at understøtte.equals. To objekter af samme form er ens hvis de har samme værdier i felterne.

AAU, Programmering i Java Intern skriftlig prøve 18. maj 2007

Forelæsning Uge 2 Mandag

dintprog Manual Revision: 731 September 30, Introduktion Notation... 3 I Begreber 4 2 Grundbegreber om programmering 4

Forelæsning Uge 2 Mandag

Forelæsning Uge 6 Mandag

Forelæsning Uge 6 Mandag

Forelæsning Uge 4 Torsdag

class Time { int hours, min; } } Time t1; // Erklær variabel af type Time class Time1 { public static void main(string[] args) { Time t1; t1.

Forelæsning Uge 1 Torsdag

University of Southern Denmark Syddansk Universitet. DM503 Forelæsning 11

Forelæsning Uge 3 Mandag

Forelæsning Uge 4 Mandag

DRONNINGER (QUEENS) Opgave 1

BILLEDREDIGERING (IMAGES)

Opfølgning på Dygtig Skildpadde (Michael) To algoritmeskabeloner

Forelæsning Uge 1 Torsdag

Forelæsning Uge 3 Mandag

Forelæsning Uge 3 Mandag

Forelæsning Uge 2 Mandag

Skriftlig eksamen i Datalogi

Forelæsning Uge 4 Mandag

Skriftlig eksamen i Datalogi

DM507 Algoritmer og datastrukturer

DM507 Algoritmer og datastrukturer

Forelæsning Uge 2 Torsdag

Om binære søgetræer i Java

Forelæsning Uge 2 Torsdag

DM01 DM Obl. Afl. Jacob Christiansen, , D12, Elias 18/ Side 1 af 11

Forelæsning Uge 2 Torsdag

Objektorienteret Programmering

class subklasse-navn extends superklasse-navn { } NorwaySpruce har superklassen Spruce, som igen har superklassen Tree.

METODER ARV KLASSER. Grundlæggende programmering Lektion 5

Java Klasse nedarvninger

SWC eksamens-spørgsmål. Oversigt

Hvad er Objekter - Programmering

DM507 Algoritmer og datastrukturer

Skriftlig eksamen i Datalogi

Videregående Programmering for Diplom-E Noter

DM507 Algoritmer og datastrukturer

DM507 Algoritmer og datastrukturer

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 2

I denne artikel vil vi bruge en User klasse som vi så vil gruppere på forskellige måder.

Forelæsning Uge 3 Torsdag

Videregående Programmering Obligatorisk opgave - 3. semester, efterår 2004

Vejledende løsninger

SWC Elementer i klassedefinition

Abstrakte datatyper C#-version

Videregående programmering i Java

Forelæsning Uge 9 Mandag

Civilingeniøreksamen januar Skriftelig prøve den 12. januar 2001 Kursusnummer 49104

DM507 Algoritmer og datastrukturer

Forelæsning Uge 4 Torsdag

Virkefeltsregler i Java

Videregående programmering i Java

Software Construction 1. semester (SWC) januar 2014 Spørgsmål 1

Skriftlig eksamen i Datalogi

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 4

UML til kravspecificering

Programmering 1999 KVL Side 5-4. Klassen Time: metoder. Metoder i objektet giver mulighed for at ændre tilstanden, eller kigge på tilstanden.

import java.awt.event.*; import java.awt.*; Container <- Panel <- Applet Component <- Button <- Checkbox <- ScrollPane <- Label

Databaseadgang fra Java

Anvendelse af metoder - Programmering

Objektorienterede metoder

Transkript:

Forelæsning Uge 12 Mandag Protected access Alternativ til public og private Abstrakte klasser og interfaces En abstrakt klasse er en klasse, som man ikke kan lave instanser (objekter) af En abstrakt klasse kan indeholde abstrakte metoder, hvor kun hovedet er angivet, mens implementationen (kroppen) mangler I et interface er alle metoder abstrakte Wildcards (jokere) Gør det muligt at beskrive komplicerede typebegrænsninger i forbindelse med generiske klasser Afleveringsopgave: Computerspil 3 Brug af nedarvning og dynamic method binding

Protected access Vi har tidligere set, at feltvariabler og metoder kan være private eller public De kan også være protected Det betyder at de kan tilgås fra klassen public selv og alle dens subklasser protected feltvariabler Samme ulemper som public Bør aldrig bruges private protected metoder Kan i nogen situationer give god mening protected I Java kan feltvariabler og metoder, der er protected, også tilgås fra klasser i samme programpakke (package) Det gør det mere tvivlsomt at benytte protected 2

Abstrakte klasser og interfaces En abstrakt klasse er en klasse, som man ikke kan lave instanser af new operatoren kan ikke anvendes på klassen I vores Newsfeed system vil det være oplagt at erklære Post til at være en abstrakt klasse Det signalerer, at vi ikke vil lave instanser af Post, men kun instanser af dens subklasser MessagePost og PhotoPost Formålet med Post er udelukkende at samle de ting, der er fælles for MessagePost og PhotoPost, og på den måde undgå kodeduplikering og opnå større læsbarhed Angiver, at klassen er abstrakt (rækkefølgen af public og abstract er uden betydning) Angiver at klassen er abstrakt <<abstract>> public abstract class Post {...... 3

Abstrakte metoder En abstrakt klasse kan indeholde abstrakte metoder En abstrakt metode er en metode, der ikke er implementeret i klassen Vi angiver kun metodens hoved, mens kroppen udelades I vores Newsfeed system har vi en display metode i hver af klasserne Post, MessagePost og PhotoPost Lad os for et øjeblik antage, at display metoden i Post klassen ikke har noget fornuftigt at gøre, f.eks. fordi Post klassen ingen feltvariabler har Så kan vi erklære display metoden til at være abstrakt public abstract void display(); Betyder at implementationen af metoden overlades til subklasserne Hvis en subklasse ikke implementerer metoden, vil subklassen kun kunne kompilere, hvis den selv gøres abstrakt Dette sikrer, at alle konkrete subklasser har en implementation af metoden 4

Interfaces Et interface ligner en abstrakt klasse, hvor alle metoder er abstrakte Men interfacet kan ikke have feltvariabler og konstruktører Interfacet specificerer, hvilke metoder der skal være, og angiver deres signaturer Implementationen af metoderne overlades til de klasser, der implementerer interfacet Interfaces kan nedarve fra hinanden, på samme måde som klasser, og vi kan derfor have subinterfaces og superinterfaces Vi er tidligere stødt på Comparable og Comparator, som begge er interfaces Angiver, at Comparable er et interface Signatur for compareto metoden, som er eneste metode i interfacet alle metoder i et interface er public og abstract (hvorfor dette ikke angives) public interface Comparable<T> { int compareto(t o); Metoden implementeres i den klasse der implementerer interfacet public class Person implements Comparable<Person> {...... Angiver, at klassen inplementerer interfacet 5

List interfacet Vi er også stødt på List interfacet Sikrer at alle implementerende klasser har de basale metoder, der skal til for at håndtere en liste, og at disse har samme signatur (dvs. samme navn, samme parametre og samme returtype) Brug af interfacet gør det let at skifte mellem forskelige slags lister, f.eks. en arrayliste og en kædet liste (LinkedList) Hvis man har erklæret alle sine variable til at være af typen List (i stedet for ArrayList eller LinkedList), er det eneste der skal ændres, det sted hvor listen instantieres Her skal man udskifte new ArrayList<>() med new LinkedList<>() (eller omvendt) 6

Hvad opnår vi? Fælles for abstrakte klasser og interfaces De bestemmer en type Man kan lave polymorfe metoder, som kan bruges på objekter fra alle subklasser af en abstrakt klasse alle de klasser, der implementerer et interface F.eks. kan reverse og shuffle metoderne i Collections klassen bruges på alle objektsamlinger, der implementerer List interfacet, mens min, max og sort metoderne desuden kræver, at elementtypen i objektsamlingen implementerer Comparable interfacet Nedarvning fra abstrakt eller konkret superklasse Vi arver både noget implementation og en type Klassen bliver en subtype af superklassen, og dens objekter kan bruges alle de steder superklassens objekter kan bruges Implementation af interface Vi arver kun typen (der er jo ingen implementation at arve) 7

Abstrakte klasse eller interface? Hvorfor har Java både abstrakte klasser og interfaces? En abstrakt klasse kan indeholde implementation (og feltvariabler) det kan et interface ikke En klasse kan implementere flere interfaces men kun være (direkte) subklasse af én anden klasse Multipel nedarvning Fox, Rabbit og Hunter klasserne nedarver både fra Drawable og fra Actor Dette kan kun lade sig gøre, hvis Drawable, Actor eller begge er et interface Hvor meget er implementeret? Almindelig (konkret) klasse: alt er implementeret (100%) Interface: ingen implementation (0%) Abstrakt klasse: delvis implementation (0-100%) 8

Abstract klasse eller interface (fortsat) Virkeligheden er (desværre) ikke helt så pæn og simpel som beskrevet ovenfor Fra og med Java 8) kan et interface indeholde implementation i form af klassemetoder og såkaldte default metoder Implementation af disse metoder nedarves til de klasser, der implementerer interfacet Default metoder er primært indført for at kunne modificere et eksisterende interface uden at ødelægge de klasser, der allerede bruger interfacet Da et interface ikke har feltvariabler og konstruktør, er det ret begrænset, hvad man kan gøre i en default metode (der er ingen tilstand at operere på) Funktionel sortering Klassemetode i Comparator (returnerer Comparator objekt) Angivelse af p's type (som oversætteren ikke længere selv kan deducere) Collections.sort(phones, Comparator. comparing((phone comparing(p -> p.getbrand()) p) -> p.getprice()) ); Collections.sort(phones, Comparator..thenComparing comparing(p ->(p p.getprice()) -> p.getbrand()) ); ); default metode i Comparator 9

Collection frameworket (udsnit) 2 forskellige slags UML pile Fuldt optrukne: nedarvning Stiplede: implementation <<interface>> Collection <<abstract class>> AbstractCollection <<interface>> Set <<interface>> List <<interface>> Queue HashSet <<interface>> SortedSet <<abstract class>> AbstractList LinkedList PriorityQueue LinkedHashSet <<interface>> NavigableSet ArrayList Vector Collection frameworket 12 interfaces 35 klasser (heraf 5 abstrakte) TreeSet AbstractList implementerer metoder, der er fælles for alle lister Gør det nemmere at definere sine egne List klasser, idet dele af implementationen allerede er lavet i AbstractList Analogt implementerer AbstractCollection metoder, der er fælles for alle collections 10

Brug af Collections og Comparable 3 forskellige slags UML pile Fuldt optrukne: nedarvning Stiplede pile: implementation Stiplede med åbent hoved: brug Collections T min(collection<t> c) T max(collection<t> c) void sort(list<t> l)... <<interface>> Collection boolean add(e e) boolean contains(object o)... <<interface>> Comparable int compareto(t o) <<interface>> List <<interface>> Queue <<interface>> Set Pixel Person String ArrayList HashSet LinkedList Adult Child 11

Funktionelle interfaces Et funktionelt interface har én enkelt abstract metode apply De steder, hvor man skal bruge et objekt, hvis type er et funktionelt interface, kan man i stedet bruge en lambda java.util.function definerer en række funktionelle interfaces, bl.a. Predicate bruges til lambda'er, der returnerer en boolsk værdi BinaryOperator bruges til lambda'er, hvor de to parametre og returværdien er af samme type (f.eks. String x String -> String) Consumer bruges til lambda'er med void returtype Supplier bruges til lambda'er, der returnerer en værdi Man kan erklære variabler, hvis type er et funktionelt interface Dermed bliver det muligt at assigne lambda'er til variabler, og dermed bruge dem forskellige steder i programmet, f.eks. som parameterværdier I næste forelæsning skal vi se, at funktionelle interfaces er særdeles nyttige i forbindelse med programmering af grafiske brugergrænseflader 12

Eksempel på brug af funktionelt interface Antag, at vi har en Person klasse med to feltvariabler name og alias, som begge er strenge Vi ønsker at definere tostring metoden til at returnere disse på formen "Kurt Jensen (KJ)", hvor "Kurt Jensen" er navnet og "KJ" er aliasset Konkatenation + StringBuilder public String tostring() { return name + " (" + alias + ")"; Funktionelt interface Konkatenation public String tostring() { StringBuilder builder = new StringBuilder(); builder.append(name); builder.append(" ("); builder.append(alias); builder.append(")"); return builder.tostring(); StringBuilder public String tostring() { BinaryOperator<String> format = (name, alias) -> name + " (" + alias + ")"; return format.apply(name, alias); Funktionelt interface Kald af apply metoden (dvs. den konstruerede lambda) Lokal variabel af type BinaryOperator<String> Initialiseres til lambda, der sammensætter de to inputparametre på den ønskede måde I mere komplekse situationer kan den sidste løsning have fordele, f.eks. kan vi bruge variablen format flere forskellige steder i koden 13

Wildcards og typebegrænsninger Klasser med typeparametre (fx. ArrayList<E>) kaldes generiske klasser Når man (for metoderne i en generisk klasse) skal beskrive parametrenes type (og returtypen) bruges der (f.eks. i Java API'en) en speciel notation indeholdende wildcards (jokere) og typebegrænsninger Det kan være nyttigt, at kende og forstå de hyppigst forekomne wildcard konstruktioner Dem vil vi nu illustrere ved hjælp af nogle eksempler Eksempel Til brug for en grafisk brugergrænseflade vil vi gerne lave en afbildning (Map), hvor nøglerne er klasser og værdierne de farver, hvormed objekter af de forskellige klasser vises Dette kan gøres, som vist nedenfor, hvor wildcardet? angiver, at man på dette sted kan bruge en vilkårlig type private Map<Class<?>, Color> colors; colors.put( Rabbit.class, Color.ORANGE ); colors.put( Fox.class, Color.BLUE ); Nøgler af type Class<?> Konstanter af type Color 14

Eksempler fra ArrayList<E> klassen boolean add(e e) Tilføjer elementet e til enden af listen (nem at forstå ingen wildcards) boolean addall(collection<? extends E> c) Tilføjer alle elementerne fra c Parameteren skal være en objektsamling (implementere Collection interfacet) Wildcardet? og type betingelsen extends E angiver, at elementtypen i c kan være en vilkårlig subtype af E Sikrer at det er lovligt at tilføje elementerne i c til vores arrayliste boolean removeif(predicate<? super E> filter) Fjerner alle de elementer der opfylder filter Parameteren skal være et prædikat (dvs. en boolsk lambda) Input parameteren til lambda'en skal være en supertype af E Sikrer at lambda'en kan bruges på elementer af typen E, idet disse så er en subtype af lambda'ens parameter 15

Eksempler fra Collections klassen void shuffle(list<?> list) Permuterer listens elementer Parameteren skal have en type, der implementere List interfacet Elementtypen i listen kan være vilkårlig Metoden kan bruges på alle lister, men f.eks. ikke på mængder og maps int frequency(collection<?> c, Object o) Returnerer antallet af forekomster af objektet o i objektsamlingen c (ved brug af equals metoden) Returtypen er et heltal Første parameter skal have en type, der implementerer Collection interfacet Anden parameter kan være et vilkårligt objekt Lovligt at spørge om frekvensen af objekter, der slet ikke kan forekomme i listen (de har trivielt frequency lig med 0) 16

Eksempler fra Collections klassen (fortsat) <T> void copy(list<? super T> dest, List<? extends T> src) Kopierer alle elementer fra src (source listen) til dest (destination listen) Begge parametre skal have typer, der implementerer List interfacet Der skal eksistere en type T, således at elementtypen i dest er en supertype af T, og elementtypen i src er en subtype af T Det betyder at elementtypen i src skal være en subtype af elementtypen i dest Sikrer at det er lovligt at indsætte elementerne 17

sort metoderne i Collections klassen <T> void sort(list<t> list, Comparator<? super T> c) Sorterer listen ved hjælp af en comparator Første parameter skal være en liste med elementtypen T Anden parameter skal være af en type, der implementere Comparator interfacet for T (eller have en supertype, der gør det) Sikrer at T (eller en supertype af T) stiller en compare metode til rådighed for sorteringen <T extends Comparable<? super T>> void sort(list<t> list) Sorterer listen ved hjælp af den naturlige ordning Parameteren skal være en liste med elementtypen T T skal opfylder den type betingelse, der står foran "void", dvs. at T skal være en subtype af Comparable<? super T> Sikrer at T (eller en supertype af T) implementerer Comparable interfacet (og dermed stiller en naturlig ordning til rådighed for sorteringen) Yderligere info om wildcards: https://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html Link 18

Computerspil 3 I den tredje delaflevering skal I bruge nogle af de ting, som I har lært om nedarvning og dynamic method binding til at strukturere jeres kode I skal indføre flere forskellige slags byer/lande: BorderCity repræsenterer en grænseby, hvor man skal betale told, når man ankommer fra udlandet CapitalCity repræsenterer en hovedstad, hvor der er mange fristelser, så man (udover at modtage bonus) bruger af sin formue MafiaCountry repræsenterer et land (Sverige!), hvor man risikerer at blive overfaldet og frarøvet dele af sin formue I skal også implementere equals og hashcode metoder i Country og City klasserne Herudover skal I rette gamle fejl og mangler holde jeres dokumentation og regression tests opdaterede herunder tilføje dokumentation og regression tests for nye programdele 19

Regression tests for BorderCity / CapitalCity Testmetoden for arrive metoden i BorderCity kan være næsten identisk med den tilsvarende testmetode i City klassen Den væsentlige forskel er, at der skal betales told, hvis spilleren kommer fra et andet land, f.eks. fra City E til City C Skaber en spiller, der ankommer fra City E til City C med en formue på 250 Beregn toldens størrelse Tag hensyn til tolden @Test public void arrivefromothercountry() { for(int i=0; i<1000; i++) { Player player = new Player(new Position(cityE, cityc, 0), 250); game.getrandom().setseed(i); // Set seed int bonus = country1.bonus(40); // Remember bonus int toll =... // Calculate toll game.getrandom().setseed(i); // Reset seed int arrive = cityc.arrive(player); // Same bonus assertequals(arrive,...); assertequals(cityc.getvalue(),... ); cityc.reset(); I bør også lave en testmetode, der tjekker, at der ikke betales told, når spilleren kommer fra samme land (f.eks. fra City D til City C) For CapitalCity klassen laves to tilsvarende testmetoder Nu skal man også tage hensyn til de penge, som spilleren bruger 20

Regression test for MafiaCountry Testmetoden for bonus metode i MafiaCountry kan være næsten identisk med den tilsvarende testmetode i Country klassen Risikoen for at blive røvet er 20% (med mindre den ændres via Options knappen) Tabet ved røveriet er et heltal mellem 10 og 50 (begge inklusive) I skal tjekke, at tabet ved røveriet ligger i intervallet [10,50] man bliver røvet ca. 20% af gangene tabet i gennemsnit udgør ca. 30 tabet kan antage alle værdier i intervallet [10,50] @Test public void bonus(){ for(int seed = 0; seed < 1000; seed++){ game.getrandom().setseed(seed); int robs = 0; int loss = 0; Set<Integer> values = new HashSet<>(); for(int i = 0; i<50000; i++) { int bonus = country2.bonus(80); if(bonus < 0) { robs++; asserttrue(...); loss -= bonus; values.add(-bonus); asserttrue(...); asserttrue(...); assertequals(...); 21

Opsummering Protected access Alternativ til public og private Abstrakte klasser og interfaces En abstrakt klasse er en klasse, som man ikke kan lave instanser (objekter) af En abstrakt klasse kan indeholde abstrakte metoder, hvor kun hovedet er angivet, mens implementationen (kroppen) mangler I et interface er alle metoder abstrakte Wildcards (jokere) Gør det muligt at beskrive komplicerede typebegrænsninger i forbindelse med generiske klasser Afleveringsopgave: Computerspil 3 Brug af nedarvning og dynamic method binding 22

Det var alt for nu.. spørgsmål 23