2e Deeltentamen nNagekeken werk ligt voor in de zaal (alfabetisch op achternaam) nOmcirkeld: tentamen2 Achter pijltje: gemiddelde tot nu toe nNeem het even mee, de uitwerking wordt in het college besproken nDiscussies over de antwoorden: in de pauze nJe mag het werk behouden
1. Static methode nNiet buiten eigen klasse aanroepen nMag klasse-variabelen niet gebruiken nKan geen nieuwe objecten maken nLevert geen resultaat op ACBBAB BADDCA CBACBD DDCADC
2. Class A : B { C D; } nA is een B nB heeft een C nD heeft een C nC is een A ACBBAB BADDCA CBACBD DDCADC
3. Virtual methode nZonder return-opdracht nZonder body nLege body nHerdefinieerbaar in subklase ACBBAB BADDCA CBACBD DDCADC
4. Wat is expressie base in de body van method M in klasse K nSuperklasse van K nMethode M in superklasse van K nthis, met superklasse van K als type nConstructor van superklasse van K ACBBAB BADDCA CBACBD DDCADC
5. Array-elementen opsommen tussen accolades mag… nWel in member, niet lokaal nWel in declaratie, niet in toekenning nWel 1D, niet 2D nWel getallen, niet objecten ACBBAB BADDCA CBACBD DDCADC
6. A b = new C() mag… nAls constructor A virtual is nAls constructor C gecast naar A nAls constructor C gedefinieerd in A nAls C subklasse van A ACBBAB BADDCA CBACBD DDCADC
7. Uitkomst van '2' + 3 n53 n5 n'5' n"23" ACBBAB BADDCA CBACBD DDCADC
8. Aantal variabelen array nVastgelegd bij declaratie nVastgelegd als array gecreëerd nGroeit door toekenning a[t]=… nGroeit door opdracht a++ ACBBAB BADDCA CBACBD DDCADC
9. Wat fout in nQuotes ontbreken in a[t]=='x' nArray a niet new aangemaakt nelse moet weg nVervang if/else door return a[t]==x; ACBBAB BADDCA CBACBD DDCADC bool Bevat( char[] a, char x) { for (int t=0; y<a.Length; t++) if (a[t]==x) return true; else return false }
10. Twee buttons met één event-handler Onderscheiden door… nKan niet nProperty van EventArgs-parameter nObject-parameter nProperty van de button ACBBAB BADDCA CBACBD DDCADC
11. Syntax/semantiek van try-catch nSyntax: nSemantiek: Voer opdrachten in blok1 uit Als er daarbij een exception optreedt van type zoals gedeclareerd, voer bijbehorend blok2 uit tryblok1catch(blok2)declaratie
12. Aanroepen van get/set minimethoden van property nGet: gebruik de property in een expressie nSet: gebruik property links van een toekenning nValue: heft de waarde van de rechterkant van die toekenning
13. String is immutable nInhoud van het object verandert niet meer nadat het is gecreëerd met new (niet: nadat het is gedeclareerd) nIndexer-property van string heeft wel een get, maar geen set (niet: is private)
14. Exceptions nNull pointer exception: als je van een objectverwijzing die niet naar een object wijst, toch een membervariabele gebruikt nArray bound exception: Als je een array gebruikt met een index die >=Length of <0
15. Aangeklikte punten tekenen vauit muisklik nGeen goed idee, want punten verdwijnen als window hertekend wordt (bijvoorbeeld na geminimaliseerd te zijn) nZet alle punten in een array, teken ze allemaal in Paint-eventhandler, doe Invalidate in MouseClick-eventhandler
16. Animatie nThread t = new Thread(run); nt.Start(); nvoid Run() { while(true) { pos.X ++; this.Invalidate(); Thread.Sleep(50); } }
17. String. Substring/Contains class String { } string Substring(int start, int lengte) { } return res; string res; res += this[start+t]; for (int t=0; t<lengte ; t++) && start+t<this.Length bool Contains(string s) { } for (int t=0; t<this.Length; t++) if (this.Substring(t, s.Length) == s) return true; return false;
18. Turven int [ ] turf = new int [11]; for (int t=0; t<cijfers.Length; t++) cijfers [t]turf [] for (int t=0; t<turf.Length; t++) pea.Graphics.FillRectangle ( Brushes.Black, 50, 20 *t, 10 * turf[t], 18 ); (int)++;
Array nDeclaratie nCreatie nOpvragen nWijzigen nLengte String [ ] a; a = new String[10]; ……a[5]…… a[5] = ……; …a.Length… …is eigenlijk overbodig! List a; a = new List(); …a.Get(5)… a.Set(5,…); …a.Count… array: oject dat een rij waarden bevat, met speciale notaties List: array “ingepakt” in een klasse, met standaard notaties nInvoegen nAchtervoegen a.Insert(5,…); List a; a = new List (); a.Add(…); uitgebreide ……a[5]…… a[5] = ……;
Voorbeeld: array class Voorbeeld : Form { } Voorbeeld ( ) { } void klik(object o, AE ae) { } TextBox in; Button b; void teken(object o, PEA pea) { } in = new TextBox(); b = new Button(); b.Click += klik; this.Paint += teken; String s = in.Text; alles[n] = s; n++; this.Invalidate(); String [] alles; int n; alles = new String[100]; n = 0; for (int t=0; t<n; t++) { pea.Graphics.DrawString( alles[t],......, y ); y+=20; } int y = 50; if (n<100) { }
Voorbeeld: array class Voorbeeld : Form { } Voorbeeld ( ) { } void klik(object o, AE ae) { } TextBox in; Button b; void teken(object o, PEA pea) { } in = new TextBox(); b = new Button(); b.Click += klik; this.Paint += teken; String s = in.Text; alles[n] = s; n++; this.Invalidate(); String [] alles; int n; alles = new String[100]; n = 0; for (int t=0; t<n; t++) { pea.Graphics.DrawString( alles[t],......, y ); y+=20; } int y = 50; if (n<100) { } List List alles; alles = new List ( ); alles.Add(s); alles[t] alles.Count;t++)
Hoe is List gemaakt? class List { } Elem [] elems; int n; © List () { elems = new Elem[10]; n = 0; } Elem Get (int p) { return elems[p]; } int Count { get { return n; } } void Add(Elem e) { } elems[n]=e; n++; if (n>=elems.Length) vergroot(); private void vergroot() { } Elem [] kopie; kopie= new Elem[2*n]; for (int t=0; t<n; t++) kopie[t] = elems[t] elems = kopie; this [int p] get { }
Kan het ook anders? class List { } Elem [] elems; int n; © List () { elems = new Elem[10]; n = 0; } Elem Get (int p) { return elems[p]; } int Count { get { return n; } } void Add(Elem e) { } elems[n]=e; n++; if (n>=elems.Length) vergroot(); private void vergroot() { } Elem [] kopie; kopie= new Elem[2*n]; for (int t=0; t<n; t++) kopie[t] = elems[t] elems = kopie; n*=2; this [int p] get { }
Ja: je kunt een List maken zonder dat een array nodig is class AndereList { } …… © AndereList () { …… } Elem this[int p] { …… } int Count { …… } void Add(Elem e) { …… } null 3
Ja: je kunt een List maken zonder dat een array nodig is class AndereList { } …… © AndereList () { …… } Elem this[int p] { …… } int Count { …… } void Add(Elem e) { …… } null 3
Ja: je kunt een List maken zonder dat een array nodig is class AndereList { } …… interface IList { } int Count { get; } ; void Clear(); void Add(Elem e) ; Elem this [int p] { get; set; }; void Insert (int p, Elem e); © AndereList () { …… } Elem this[int p] { …… } int Count { …… } void Add(Elem e) { …… }
Namespace System.Collections.Generic List Andere List IList interfacediverse implementaties
Voorbeeld: List class Voorbeeld : Form { } Voorbeeld ( ) { } void klik(object o, AE ae) { } TextBox in; Button b; void teken(object o, PEA pea) { } in = new TextBox(); b = new Button(); b.Click += klik; this.Paint += teken; String s = in.Text; alles[n] = s; n++; this.Invalidate(); alles = new String[100]; n = 0; for (int t=0; t<n; t++) { pea.Graphics.DrawString( alles[t],......, y ); y+=20; } int y = 50; List alles; alles = new List ( ); alles.Add(s); alles[t] alles.Count;t++) IList alles; AndereList
Varianten van List ICollectionIList ISet interface ICollection { void Add(Elem x); bool Remove(Elem x); bool Contains(Elem x); int Count { get; }; void Clear(); } interface IList : ICollection { Elem this[int n] { get; set; } ; int IndexOf(Elem x); void Insert(int n, Elem x); void RemoveAt(int n); } genummerd zonder dubbele
Implementaties van Collections LinkedList Queue Stack List HashSet SortedSet SortedList Sorted Dictionary IList ISet IDictionary ICollection
Voorbeeld: Collection class Voorbeeld : Form { } Voorbeeld ( ) { } void klik(object o, AE ae) { } TextBox in; Button b; void teken(object o, PEA pea) { } in = new TextBox(); b = new Button(); b.Click += klik; this.Paint += teken; String s = in.Text; alles[n] = s; n++; this.Invalidate(); alles = new String[100]; n = 0; for (int t=0; t<n; t++) { pea.Graphics.DrawString( alles[t],......, y ); y+=20; } int y = 50; List alles; alles = new List ( ); alles.Add(s); alles[t] alles.Count;t++) IList alles; ICollection alles; LinkedList
Hoe doorloop je een Collection? nList nCollection for (int t=0; t<alles.Count; t++) doeIetsMet( alles[t] ); foreach (String s in alles) doeIetsMet( s ); opdracht for)(expropdrachtexpr ;; Speciale syntax voor specifieke situatie met bepaalde klasse typeexprinnaamforeach()opdracht
Implementaties van Collections IEnumerable IEnumerator IComparator LinkedList Queue Stack List HashSet SortedSet SortedList Sorted Dictionary IList ISet IDictionary ICollection
Toepassing: schets-editor SchetsWin Tools Akties Menu MDI- Container SchetsControl
Schets: Klasse-ontwerp Control Form UserControl Hoofdscherm SchetsWin SchetsControl Schets ImageBitmap Button Base Button RadioButton SchetsEditor System.Windows.Forms System.Drawing Program Container Control
Schets: Klasse-ontwerp Control Form UserControl Hoofdscherm SchetsWin SchetsControl Schets ImageBitmap Button Base Button RadioButton SchetsEditor System.Windows.Forms System.Drawing Program Container Control ISchetsTool TekstTool LijnTool PenTool GumTool RechthTool VolRechthTool TweepuntTool Startpunt Tool
Member-variabelen class SchetsWinclass SchetsControlclass Schets : Form: UserControl { } { } { } MenuStrip strip; SchetsControl sc; ISchetsTool huidig; Schets schets; Color kleur; Bitmap bm;
Schoonmaakwerk doen class SchetsWinclass SchetsControlclass Schets : Form: UserControl { } { } { } MenuStrip strip; SchetsControl sc; ISchetsTool huidig; Schets schets; Color kleur; Bitmap bm; void teken(...PEA p) { } schets.Teken (p.Graphics); void Teken (Graphics g) { } gr.DrawImage (bm, 0, 0); void Schoon(...AE a) { } schets.Schoon(); void Schoon( ) { } this.Invalidate(); Graphics. FromImage(bm); Graphics g = g.FillRectangle (White,0,0,w,h); SchetsWin() { } sc = new SchetsControl(); this.maakAkties(); void maakAkties() { } Button b b.Text = "Clear"; b.Click += sc.Schoon; = new Button();
Tool kiezen class SchetsWin : Form { } MenuStrip strip; SchetsControl sc; ISchetsTool huidig; void klikTool ( object obj, AE ae ) { } huidig = obj. Tag(Button)() (ISchetsTool) void maakTools( { } ICollection tools) foreach (ISchetsTool tool in tools) { } RadioButton r = new RadioButton(); r.Text = tool.ToString(); r.Click += this.klikTool; r.Tag = tool;
Tool gebruiken class SchetsWin : Form { } MenuStrip strip; SchetsControl sc; ISchetsTool huidig; SchetsWin ( ) { } sc.MousePress += void klikTool ( object obj, AE ae ) { } huidig = obj. Tag(Button)() (ISchetsTool) sc = new SchetsControl ( ); this.muis; void muis ( object o, MEA mea) { } huidig.MuisVast( interface ISchetsTool { } void MuisVast( mea.Location) Point p); sc, SchetsControl s,
Tool gebruiken class SchetsWin : Form { } MenuStrip strip; SchetsControl sc; ISchetsTool huidig; SchetsWin ( ) { sc.MousePress += void klikTool ( object obj, AE ae ) { } huidig = obj. Tag(Button)() (ISchetsTool) sc = new SchetsControl ( ); ( object o, MEA mea) { } huidig.MuisVast( sc, mea.Location); interface ISchetsTool { } void MuisVast( Point p); SchetsControl s, } => anonieme methode
Schets-tools (1) ISchetsTool interface ISchetsTool { } void muisVast ( SchetsControl s, Point p) ; void muisLos ( SchetsControl s, Point p) ; void muisDrag ( Schetscontrol s, Point p ) ; void Letter ( SchetsControl s, char k) ;
Schets-tools (2) ISchetsTool Startpunt Tool abstract class StartpuntTool : ISchetsTool { } virtual void MuisVast ( SchetsControl s, Point p) {startpunt = p; } Point startpunt ; abstract void MuisDrag ( SchetsControl s, Point p) ; abstract void Letter ( SchetsControl s, Point p) ; virtual void MuisLos ( SchetsControl s, Point p) {kwast = new SolidBrush( s.Penkleur ); } Brush kwast ;
Schets-tools (3) ISchetsTool TekstTool Startpunt Tool class TekstTool : StartpuntTool { } override void Letter ( SchetsControl s, char c) { } Graphics g = s. MaakBitmapGraphics(); g. DrawString( c, kwast,..., startpunt ); startpunt.x += ……c….Width; override void MuisDrag ( SchetsControl s, Point p) { } override void MuisLos ( SchetsControl s, Point p) { }
Schets-tools (4) ISchetsTool TekstTool Tweepunt Tool Startpunt Tool abstract class TweepuntTool : StartpuntTool { } override void MuisDrag ( SchetsControl s, Point p) { } Graphics g = s. CreateGraphics(); this. Bezig (g, startpunt, p); abstract void Bezig (Graphics g, Point p1, Point p2) ; override void MuisLos ( SchetsControl s, Point p) { Graphics g = s. MaakBitmapGraphics(); this. Compleet (g, startpunt, p); } virtual void Compleet (Graphics g, Point p1, Point p2) { this. Bezig (g, p1, p2); }
Schets-tools (5) Tool Rechthoek Tool TekstTool Tweepunt Tool Startpunt Tool class RechthoekTool : TweepuntTool { } override void Bezig ( Graphics g, Point p1, Point p2 ) g. DrawRectangle(kwast, Punten2Rechthoek(p1,p2) ); { } static Rectangle Punten2Rechthoek(Point p1, Point p2) { } return new Rectangle( new Point( Math.Min(p1.X,p2.X), Math.Min(p1.Y,p2.Y)) new Size ( Math.Abs(p1.X-p2.X), Math.Abs(p1.Y-p2.Y)) );
Schets-tools (6) Tool TekstTool Tweepunt Tool Startpunt Tool class VolRechthoekTool : RechthoekTool { } override void Compleet ( Graphics g, Point p1, Point p2 ) { } Rechthoek Tool VolRechth Tool g. FillRectangle(kwast, Punten2Rechthoek(p1,p2) );
Schets-tools (7) Tool LijnToolTekstTool Tweepunt Tool Startpunt Tool class LijnTool : TweepuntTool { } override void Bezig ( Graphics g, Point p1, Point p2 ) { } g. DrawLine( MaakPen(kwast,3), p1, p2 ); Rechthoek Tool VolRechth Tool
Schets-tools (8) Tool LijnToolPenToolTekstTool Tweepunt Tool Startpunt Tool class PenTool : LijnTool { } override void MuisDrag ( SchetsControl s, Point p ) { } this. MuisLos (s, p); this. MuisVast (s, p); Rechthoek Tool VolRechth Tool
Schets-tools (9) Tool LijnTool PenToolGumTool TekstTool Tweepunt Tool Startpunt Tool class GumTool : PenTool { } override void Bezig ( Graphics g, Point p1, Point p2 ) { } Rechthoek Tool VolRechth Tool g. DrawLine( MaakPen(Brushes.White,7), p1, p2 );