Delegater, events och lambdauttryck

Relevanta dokument
Polymorfi. Objektorienterad och komponentbaserad programmering

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

Language Integrated Query, LINQ, och databaser

Generiska konstruktioner. Kursbokens kapitel 13

Föreläsning 3-4 Innehåll

Java, klasser, objekt (Skansholm: Kapitel 2)

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

Uppgiften är att beskriva en kvadrat i ett Java program. En första version av programmet skulle kunna se ut så här:

Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser

Föreläsning 5-6 Innehåll

4 13 / %.; 8 </" '': " / //&' " " ' * TelefonKostnad +,-%&. #!" $% " &' . > / ' 5 /' * 13/ &' static Math 1+" &'/ % 12 "" static "' * 1 /") %& &

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Föreläsning 8. Arv. Arv (forts) Arv och abstrakta klasser

Funktionens deklaration

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

public och private Obs: private inte skyddar mot access från andra objekt i samma klass.

Förstå grunderna i LINQ. Mål med lektionen!

Objektorienterad programmering i Java

Arbeta med databas. Översikt. Lektion 1: Arbeta med Entity Data Models. Arbeta med Entity Data Models. LINQ (Language Integrated Query).

Föreläsning 8 Programmeringsteknik och Matlab 2D1312/2D1305. Klass Object, instans av klass public/private Klassvariabler och klassmetoder

Att deklarera och att använda variabler. Föreläsning 10. Synlighetsregler (2) Synlighetsregler (1)

DI-institutionen Sid 1 av 6 Hans-Edy Mårtensson Sten Sundin

Konstruktion av klasser med klasser

I STONE. I Variabler, datatyper, typkonvertering. I Logiska och matematiska uttryck. I Metoder-returvärde och parametrar. I Villkorssatser if/else

2D1311 Programmeringsteknik för Bio1 och Bio2, vt 2003 Fiktivt prov På flervalsfrågorna är endast ett svar rätt om inget annat anges i frågan! Det rik

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Föreläsning 2. Täcker material från lektion 1, 2, 3 och 4:

Enkla variabler kontra referensvariabel

Modeller, Objekt och Klasser

Föreläsning 11. Arrayer. Arrayer. Arrayer. Lagrar flera värden av samma typ Kan vara primitiva typer eller objekt. Kan ha en array av t.

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

Föreläsning 2, vecka 8: Repetition

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-17, TDA540. Dag: , Tid:

UML. Klassdiagr. Abstraktion. Relationer. Överskugg. Överlagr. Aktivitetsdiagram Typomv. Typomv. Klassdiagr. Abstraktion. Relationer.

OOP Objekt-orienterad programmering

Föreläsning 4. Klass. Klassdeklaration. Klasser Och Objekt

DUGGA: Objektorienterade applikationer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

DAT043 - Föreläsning 7

Typkonvertering. Java versus C

Variabler som hör till enskilda objekt. Deklareras på översta nivån i klassen och i regel som private.

1 Uppgift 1. a) Skapar ett Company-objekt med hjälp av den överlagrade konstruktorn. Du kan själv välja värden på instansvariablerna.

Objektorienterad programmering

Grundläggande programmering, STS 1, VT Sven Sandberg. Föreläsning 14

Subklasser och arv Inledning till grafik (JFrame och JPanel). Något om interface. Objektorienterad programvaruutveckling GU (DIT011) Subklasser

Introduktion till Datalogi DD1339. Föreläsning 2 22 sept 2014

Objekt och klasser - Introduktion. Objekt. SparKonto.java 2. SparKonto.java 1. Konton.java. Ett objekt har: Ett bankkonto

OOP Objekt-orienterad programmering

Bankkonto - övning. Övning 2 Skriv en metod, geträntan, som returnerar räntan.

Objektorienterad Programkonstruktion. Föreläsning 7 24 nov 2015

Dugga i Grundläggande programmering STS, åk

Frivillig Java-swing-Graphics-lab Programmeringsteknik MN1 vt02

DD2310. Javaprogrammering för Pythonprogrammerare. Johan Boye

Klasshierarkier - repetition

Grundläggande programmering med C# 7,5 högskolepoäng. Provmoment: Ladokkod: Tentamen ges för: TEN1 NGC011 ADAEK17, ASYST17 samt öppen för alla

DIAGNOSTISKT PROV. Tid. Hjälpmedel. Antaganden. Rättning. Övrigt. Diagnostiskt Prov. Klockan Inga

Föreläsning 8 SLUMPTAL, SIMULERING + INTRODUKTION TILL VEKTORER

Kungliga Tekniska Högskolan Ämneskod 2D4134 Nada Tentamensdag maj - 19 Tentamen i Objektorientering och Java Skrivtid 5 h

Objektorienterad Programkonstruktion. Föreläsning jan 2016

Inkapsling tumregler. Åtkomstmodifikatorer, instantiering, referenser, identitet och ekvivalens, samt klassvariabler. public och private

Programmering i C++ EDA623 Mer om klasser. EDA623 (Föreläsning 6) HT / 26

Föreläsning 5 (6) Metoder. Metoder Deklarera. Metoder. Parametrar Returvärden Överlagring Konstruktorer Statiska metoder tostring() metoden javadoc

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

int iarray[]= new int[3]; // deklarera ett heltalsfält med tre heltal int jarray[]={ 1, 3, 5, 7, 9, 11, 13, 15}; // initierat fält 8 element

JAVAUTVECKLING LEKTION 11

Högskolan Dalarna sid 1 av 7 DI-institutionen Hans-Edy Mårtensson Sten Sundin

OOP Objekt-orienterad programmering

a. Vilka av följande påståenden är riktiga? Observera att felaktigt valda påståenden ger poängavdrag. (4p)

Outline. Objektorienterad Programmering (TDDC77) Signatur. Klassen calculator. Överlagring (overloading) Arv (inheritance) Ahmed Rezine

FÖRSLAG TILL LÖSNINGAR FÖR TENTAMEN I INTERNETPROGRAMMERING MED JAVA, 5p för SY , kl

Föreläsning 4 Innehåll. Abstrakta datatypen lista. Implementering av listor. Abstrakt datatypen lista. Abstrakt datatyp

Klasshierarkier. Klasser kan byggas på redan definierade klasser

Föreläsning 6: Metoder och fält (arrays)

Objektorienterad Programmering (TDDC77)

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Arv. Objektorienterad och komponentbaserad programmering

Tentamen i Programmering

Namn: Personnr: 1 2D1310 Programmeringsteknik i Java för B,V (1p) 13 januari 2001, kl Hjälpmedel: En Javabok. För betyget godkänt krävs at

Tentamen ID1004 Objektorienterad programmering October 29, 2013

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

Laboration 13, Arrayer och objekt

Del A (obligatorisk för alla)

Två designmönster, MVC och Observer/Observable. Objektorienterad programvaruutveckling GU (DIT011)

Objekt och klasser - Introduktion

Det finns en referensbok (Java) hos vakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Metoder (funktioner) Murach s: kap Winstrand Development

Lösningar till Fiktiv Tentamen på kursen. 2D4135 Objektorienterad programmering, design och analys med Java vt2004. Teoridel

Outline. Objektorienterad Programmering (TDDC77) Att instansiera en klass. Objekt. Instansiering. Åtkomst. Abstrakt datatyp.

Föreläsning 7 Innehåll. Rekursion. Rekursiv problemlösning. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursion. Rekursivt tänkande:

Grundläggande programmering med C# 7,5 högskolepoäng

Kort om klasser och objekt En introduktion till GUI-programmering i Java

Rekursion. Att tänka rekursivt Att programmera rekursivt i Java Exempel. Programmeringsmetodik -Java 254

Objektorienterad Programmering DAT043. Föreläsning 9 12/2-18 Moa Johansson (delvis baserat på Fredrik Lindblads material)

Interface. Interface. Tobias Wrigstad (baserat på bilder från Tom Smedsaas) 3 december 2010

Mer källkod. Styrstrukturer Val Slingor Operatorer Källkodsexempel med minne. Erik Forslin. Rum 1445, plan 4 på Nada

Del A (obligatorisk för alla)

Outline. Objektorienterad Programmering (TDDC77) Åsidosättning. Signatur. Åsidosättning. Abstrakta klasser. Ahmed Rezine.

F4 Klasser och Metoder. ID1004 Objektorienterad programmering Fredrik Kilander

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek

Systemutvecklare SU13, Malmö

2 b) Följande finns definierat: public class Käk String titel = "Chili con carne"; Krydda[] kryddor = new Krydda[10]; kryddor[0] = new Krydda("Svartpe

Transkript:

Delegater, events och lambdauttryck Läs avsnitt 5.13 Delegater, i kursboken och Delegater, https://msdn.microsoft.com/en-us/library/ms173172.aspx Events, https://msdn.microsoft.com/en-us/library/awbftdfh.aspx Lambdauttryck, https://msdn.microsoft.com/en-us/library/bb397687.aspx 1

Delegater, ungefär som funktionspekare... En delegat är en lista med hänvisningar till metoder Det går att anropa metoderna via delegaten Endast den sist inlagda metodens returvärde returneras via en delegat Definition av en delegattyp delegate returtyp Typnamn(parameterlista) Deklaration samt deklaration och initiering av en delegat Typnamn delegatensnamn; Typnamn delegatensnamn = EnMetod; Typnamn delegetensnamn = new Typnamn(EnMetod); //Gamla sättet Lägga till flera metoder delegatensnamn += EnMetod delegetensnamn += new Typnamn(EnMetod) Ta bort metoder delegatensnamn -= EnMetod delegatensnamn -= new Typnamn(EnMetod) 2

Att sända med metoder som parametrar public delegate double AritmetiskFunktion(double etttal, double ettannattal); public class RäkneDosa public void Beräkna(AritmetiskFunktion delegattillenmetod, double tal1, double tal2) double resultatet = delegattillenmetod(tal1, tal2); Console.WriteLine("Resultatet blir: " + resultatet); public class Program public static double Plus(double tala, double talb)return tala + talb; public static double Minus(double tala, double talb)return tala - talb; public static void Main() RäkneDosa räknedosan = new RäkneDosa(); räknedosan.beräkna(plus, 1, 2); räknedosan.beräkna(minus, 1, 2); AritmetiskFunktion gånger = delegate(double tal1, double tal2) return tal1 * tal2; ; räknedosan.beräkna(gånger, 1, 2); räknedosan.beräkna(delegate(double tal1, double tal2)return tal1 / tal2;, 1, 2); Resultatet blir: 3 Resultatet blir: -1 Resultatet blir: 2 Resultatet blir: 0,5 3

En delegat fungerar som en lista... public class Texter public void Välkommen() Console.WriteLine("Hej på dig!"); public void Fråga() Console.WriteLine("Hur står det till?"); public static void Avsked() Console.WriteLine("Hej då!"); public delegate void InfoTyp(); public class Anslagstavla private InfoTyp InfoListan; public void LäggTillInfo(InfoTyp meddelande) InfoListan += meddelande; public class Program public static void Main() Texter textrad = new Texter(); Anslagstavla tavlan = new Anslagstavla(); public void VisaInfo() InfoListan(); tavlan.läggtillinfo(textrad.välkommen); tavlan.läggtillinfo(textrad.fråga); tavlan.läggtillinfo(texter.avsked); tavlan.visainfo(); Hej på dig! Hur står det till? Hej då! 4

Det blir enklare med ett event public class Texter public void Välkommen() Console.WriteLine("Hej på dig!"); public void Fråga() Console.WriteLine("Hur står det till?"); public static void Avsked() Console.WriteLine("Hej då!"); public delegate void InfoTyp(); public class Anslagstavla public event InfoTyp InfoListan; public void VisaInfo() InfoListan(); Ett event är en delegat som endast kan förekomma till vänster om += och -= utanför den klass i vilken den är deklarerad. Därför är det ingen fara att deklarera den som publik i de flesta sammanhang. public class Program public static void Main() Texter textrad = new Texter(); Anslagstavla tavlan = new Anslagstavla(); tavlan.infolistan += textrad.välkommen; tavlan.infolistan += textrad.fråga; tavlan.infolistan += Texter.Avsked; tavlan.visainfo(); Hej på dig! Hur står det till? Hej då! 5

Action och Func I namnrymden System finns två olika uppsättningar av redan färdigdefinierade typer av delegater, Action och Func Delegater av typen Action kan hänvisa till metoder som returnerar inget, men kan ha upp till 16 parametrar Definitionen av en Action-delegat är lite omständig, ett exempel med två parametrar: public delegate void Action<in T1, in T2>( T1 arg1, T2 arg2 ) Action-delegater: läs mera, https://msdn.microsoft.com/en-us/library/system.action(v=vs.110).aspx Delegater av typen Func kan hänvisa till metoder som har ett returvärde och upp till 16 parametrar Ett exempel på definitionen av en Func-delegat med två parametrar och en returtyp: public delegate TResult Func<in T1, in T2, out TResult>( T1 arg1, T2 arg2 ) Func-delegater: läs mera, https://msdn.microsoft.com/en-us/library/bb534960(v=vs.110).aspx 6

Räknedosan med hjälp av Func-delegater public class RäkneDosa public void Beräkna(Func<double, double, double> EnMetod, double tal1, double tal2) double resultatet = EnMetod(tal1, tal2); Console.WriteLine("Resultatet blir: " + resultatet); Returtypen kommer alltid sist public class Program public static double Plus(double tala, double talb)return tala + talb; public static double Minus(double tala, double talb)return tala - talb; public static void Main() RäkneDosa räknedosan = new RäkneDosa(); räknedosan.beräkna(plus, 1, 2); räknedosan.beräkna(minus, 1, 2); Resultatet blir: 3 Resultatet blir: -1 Resultatet blir: 2 Resultatet blir: 0,5 Func<double, double, double> gånger = delegate(double tal1, double tal2) return tal1 * tal2; ; räknedosan.beräkna(gånger, 1, 2); räknedosan.beräkna(delegate(double tal1, double tal2)return tal1 / tal2;, 1, 2); 7

Anslagstavlan med hjälp av en Action-delegat public class Texter public void Välkommen() Console.WriteLine("Hej på dig!"); public void Fråga() Console.WriteLine("Hur står det till?"); public static void Avsked() Console.WriteLine("Hej då!"); public class Anslagstavla public event Action InfoListan; public void VisaInfo() InfoListan(); public class Program public static void Main() Texter textrad = new Texter(); Anslagstavla tavlan = new Anslagstavla(); tavlan.infolistan += textrad.välkommen; tavlan.infolistan += textrad.fråga; tavlan.infolistan += Texter.Avsked; tavlan.visainfo(); Hej på dig! Hur står det till? Hej då! 8

EventHandler I namnrymden System finns delgaten EventHandler definierad public delegate void EventHandler<TEventArgs>( object sender, TEventArgs e ) Se, https://msdn.microsoft.com/en-us/library/db0etb8x(v=vs.110).aspx Metoden som EventHandler hänvisar till måste ha en parameterlista bestående av parametrarna object sender och TEventArgs e object sender, ska referera till det objekt som avfyrade eventet TEventArgs e, e är en referens till ett objekt som kan innehålla extra information om det event avfyras. Klassen för ett sådant objekt får du skapa själv. Den klassen bör ärva från klassen System.EventArgs. Om du inte har någon extra information som ska bifogas det event som avfyras kan du i stället sända med EventArgs.Empty 9

Observer-mönstret Mönstret består av en förvaltare som har information och en eller flera observatörer som återger förvaltarens information Mönstret garanterar att observatörerna automatiskt blir underrättade om förändringar av förvaltarens information För att det ska vara möjligt måste varje informatör prenumerera på förvaltarens tjänst om att bli underrättad av observatören I exemplet Observer beskriver klassen Dokumenten förvaltare av information, i det här fallet ett textmeddelande beskriver klasserna Prenumerant, VisaInfo och VisaStatistik observatörer Dokument-objektet avfyrar ett event av typen EventHandler varje gång dess meddelande har förändrats Vilken metod som ska anropas i varje observatör bestämmer observatörerna själva när registerar sig till prenumerationen av tjänsten. I exemplet ListBoxExempel02 tillämpas observer-mönstret Observatören är klassen DataSource. Därför kan vi inte se vilken metod som event PropertyChanged är kopplad till. Vi kan enbart avfyra eventet så snart som en persons information har förändrats En instans av DataSource hittar du i verktygslådan för grafiska komponenter. Det är bara att dra in den i det fönster där den behövs. 10

Lambdauttryck Lambdauttryck är ett förenklat skrivsätt för anonyma metoder Lambdauttryck börjar med en parameterlista inom ( ) => markerar att lambdauttryckets kropp följer, kroppen markeras med I lambdauttryckets kropp kan man lägga vanliga satser // Här definieras en anonym metod Funktion summan = delegate (double tal1, double tal2) return tal1 + tal2; ; dosan.beräkna(summan, 1, 2); // Här skapas en anonym metod med hjälp av ett lambdauttryck Funktion skillnaden = (double tal1, double tal2) => return tal1 - tal2; ; dosan.beräkna(skillnaden, 1, 2); // Man behöver inte deklarera parametrarnas typer i ett lambdauttryck Funktion gånger = (tal1, tal2) => return tal1 * tal2; ; dosan.beräkna(gånger, 1, 2); // Här definieras ett lambdauttryck direkt i anropet till metoden Beräkna dosan.beräkna((tal1, tal2) => return tal1 / tal2;, 1, 2); 11

Lambdauttryck och FCL Många metoder som kräver någon typ av extra information om storleksordning, giltigt interval för värden eller liknande, kan ofta ta lambdauttryck Person[] personer = ; new Person("Kalle", 30), new Person("Zeke", 10), new Person("Kajsa", 50), new Person("Jan", 27) Array.Sort(personer, (persona, personb) => return persona.namn.compareto(personb.namn); ); List<Person> listan = new List<Person>(personer); listan.sort((persona, personb) => ); if (persona.ålder < personb.ålder) return -1; else if (persona.ålder == personb.ålder) return 0; else return 1; 12

Restriction Operators För de flesta collections kan man göra olika urval och beräkningar av de objekt som är lagrade Det finns olika operatorer i form av tilläggsmetoder för collections i namnrymden System.Linq Operateratorena är beroende av selectors eller predicates. Dessa beskriver hur de värden som operatorerna använder ska betraktas eller behandlas. Predicate och selectors kan beskrivas med hjälp av lambda-uttryck Ett predicate, ska returnera ett värde av typen bool En selector, kan returnerar en valfri typ av värde Exempel på operatorer med predecates är, Count, Single, While Exempel på operatorer med selectorer är, Max, Min, Select Se The.NET Standard Query Operators https://msdn.microsoft.com/en-us/library/bb394939.aspx 13

Mera om lambdauttryck Man behöver inte markera lambdautryckets parameterlista med ( ) och dess kropp med samt använda return, förutsatt att inga tvetydigheter uppstår. Metoden Where finns i namnrymden System.Linq. Ordet var markerar att typen ska väljas implicit. Ofta blir IEnumerable vald för samlingar av värden. var jämnaår = personer.where( x => x.ålder % 10 == 0 ); skriv("personer som har fyllt jämnt i år", jämnaår); Metoden skriv skriver ut en samling med personer. foreach-loopar fungerar enbart med samlingar som implementerar IEnumerable. Arrayer och alla typer av Container-classer gör det. private static void skriv(string text, IEnumerable<Person> personlista) Console.WriteLine(text); foreach (Person person in personlista) Console.WriteLine(person); Console.WriteLine(); 14