Over-erving nObjecten van een subklasse erven variabelen en methoden&properties van de superklasse kleiner straal CirkelGroei geërfd zelf gede- clareerd groter
Klasse-hiërarchie in Forms ButtonBaseButton CheckBox RadioButton TextBox RichTextBox TextBoxBase Container Control Form UserControl Panel Label TrackBar Scrollable Control ListView TreeView FileDialog ColorDialog Component Control Common Dialog
Klasse-hiërarchie in Forms PaintEventArgs MouseEventArgs KeyPressEventArgs EventArgs ComponentCommonDialog ControlLabel TrackBar ButtonBase Object String Bitmap Graphics moeder van alle klassen
Hiërarchie-ontwerp nclass Voertuig :Vervoermiddel class Boot :Vervoermiddel “is een” Vervoer middel Voertuig Boot
class Snelweg { } Snelweg( ) { Paint += teken; } void teken(O o, PEA pea) { for (...t...) rijbaan[t].Teken( pea.Graphics, t*120, 60) } class MVoertuig { } void Teken(Graphics g) { } class Auto : MVoertuig { } void Teken(Graphics g) { gr.Fill ( ); } MVoertuig [ ] rijbaan = new MVoertuig [15]; class VrachtW : MVoertuig { } void Teken(Graphics g) { gr.Fill ( ); } virtual override rijbaan[2] = new Auto(); override
class VrachtW : MVoertuig { } void Teken(Graphics g) { } class Combinat : VrachtW { } void Teken(Graphics g) { } g.FillRect(...); g.FillEllipse(...); g.FillRect(...); g.FillEllipse(...); g.DrawLine(...); g.FillRect(...); g.FillEllipse(...); base. Teken(g); versie-management problematiek
class VrachtW : MVoertuig { } void Teken(Graphics g) { } } } g.FillRect(...); g.FillEllipse(...); g.FillRect(...); g.FillEllipse(...); g.DrawLine(...); g.FillRect(...); g.FillEllipse(...); base. Teken(g); aanhang. Teken(g); “is een” “heeft een” class Combinat : VrachtW { void Teken(Graphics g) { Aanhanger aanhang;
Virtual - Override A a = new B (); dit mag, als class B : A a. m( ); deze methode komt uit klasse: nB als m virtual in A en override in B nA anders
Hoofdstuk 10.1 Toepassing: Bitmap-editor
nKlik punten op scherm nPlaatje verschuiven left, right, up, down nPlaatje bewerken clear, invert, bold, outline n“Game of life”
Opdeling in klassen nHoofdscherm gebruikersinterface, menu’s, akties, files nBitmapControl tekenen van het plaatje op het scherm nBitMap plaatje in geheugen, operaties
Member-variabelen nclass Hoofdscherm uBitmapControl viewer; uMenuStrip menuStrip; nclass BitmapControl uBitMap model; nclass BitMap ubool [, ] vakjes; : Form : UserControl zelfgemaakt
Methoden Hoofdscherm nclass Hoofdscherm : Form uHoofdscherm uvergroten // eventhandler voor Resize uafsluiten // eventhandler voor "Close"-menu
Methoden BitmapControl nclass BitmapControl : UserControl uBitmapControl uteken// eventhandler voor Paint uklik// eventhandler voor MouseClick ustarten, stoppen // voor animatie-menu uuitvoeren // voor andere menu-keuzes
Methoden BitMap nclass BitMap uconstructorBitMap, BitMap upropertiesBreedte, Hoogte upunten zettenveranderKleur, vraagKleur uschuivenLeft, Right, Up, Down ubewerkenClear, Invert, Bold, Outline combineer game of lifeLife, buren
Methoden BitMap (versie 2) nclass BitMap : System.Drawing.Bitmap uconstructorBitMap, BitMap upropertiesBreedte, Hoogte upunten zettenveranderKleur, vraagKleur uschuivenLeft, Right, Up, Down ubewerkenClear, Invert, Bold, Outline combineer game of lifeLife, buren
class Hoofdscherm public Hoofdscherm( ) { } this. Text = "Bitmap Editor"; this. viewer = new BitmapControl(); this. menuStrip = new MenuStrip( ); this. maakMenu(); this. Controls. Add(menuStrip); this. Controls. Add(viewer); this. Resize += this.vergroten; this. vergroten(null, null); // meteen al even
class Hoofdscherm private void maakMenu( ) { ToolStripDropDownItem menu; } MenuStrip menuStrip; menu = new ToolStripDropDownItem("File"); menuStrip. Items. Add(menu); menu.DropDownItems.Add("Close", null, this.afsluiten); menu = new ToolStripMenuItem("Move"); menuStrip. Items. Add(menu); menu.DropDownItems.Add("Left", null, viewer.uitvoeren); BitmapControl viewer; menu.DropDownItems.Add("Right",null, viewer.uitvoeren); menu.DropDownItems.Add("Up", null, viewer.uitvoeren); menu.DropDownItems.Add("Down",null, viewer.uitvoeren);
class Hoofdscherm void vergroten (object o, EventArgs ea) { viewer.Location = new Point(10,40); viewer.Size = new Size (w, h); } int w = this.ClientSize.Width – 20; int h = this.ClientSize.Height – 50; void afsluiten (object o, EventArgs ea) { this.Close(); }
Methoden BitMap nclass BitMap uconstructorBitMap, BitMap upropertiesBreedte, Hoogte upunten zettenveranderKleur, vraagKleur uschuivenLeft, Right, Up, Down ubewerkenClear, Invert, Bold, Outline combineer game of lifeLife, buren
class BitMap public BitMap ( int w, int h ) { } vakjes = new bool [w, h]; public BitMap ( BitMap ander) { } public void verander ( int x, int y, bool b ) { } public bool vraag ( int x, int y ) { } vakjes[x, y] = b; return vakjes[x, y] ; vakjes = new bool [ander.Breedte, ander.Hoogte]; this.Kopieer(ander); public int Breedte { } get { return vakjes.GetLength(0); } property
class BitMap void combineer ( Bitmap ander { this. verander (x, y, ); for (int x=0; this.Breedte; x++) for (int y=0; y<this.Hoogte; y++) this.vraag(x,y)ander.vraag(x,y)comb (,) comb),Functie } void Clear ( ) { this.combineer(this, (a,b)=>false ); } void Invert ( ) { this.combineer(this, (a,b)=>!a ); } void Kopieer(Bitmap ander) { this.combineer(ander, (a,b)=>b ); } delegate bool Functie (bool, bool) ; nieuwe expressie: naamloze functie nieuwe type-declaratie: het type van een functie
class BitMap public void Left ( ) { } this.verander( x-1, y, this.vraag(x,y) ); for (int y=0; y<this.Hoogte; y++) for (int x=0 ; x<this.Breedte; x++) 1 { this.verander( this.Breedte-1, y, false ); }
class BitMap public void Right ( ) { } this.verander( x, y, this.vraag(x-1,y) ); for (int y=0; y<Hoogte; y++) for (int x=0 ; x<Breedte; x++) Breedte-1; x>0; x-- ) { this.verander( 0, y, false ); }
class BitMap public void Bold ( ) { BitMap ander; ander = new BitMap(this); ander. Left ( ); this. combineer (ander, (a,b)=>a||b ); ander = new BitMap(this); ander. Down ( ); } this. combineer (ander, (a,b)=>a||b );
class BitMap public void Outline ( ) { BitMap ander; ander = new BitMap(this); ander. Left ( ); ander. Down ( ); } this. combineer (ander, (a,b) => a != b );
class BitMap public void Life ( ) { BitMap oud; oud = new BitMap(this); this. verander (x, y, } int n = oud. buren(x,y); n==3 || n==2 && oud.vraag(x,y) ); for (int y=0; y<Hoogte; y++) for (int x=0; x<Breedte; x++) { }
class BitMap public int buren (int x, int y ) { int xl = x-1; int xr = x+1; int yb = y-1; int yo = y+1; return n; int n = 0; if ( this.isZwart(xl,yb) ) n++; if ( this.isZwart(x,yb) ) n++; if ( this.isZwart(xr,yb) ) n++; if ( this.isZwart(xl,y ) ) n++; if ( this.isZwart(xr,y ) ) n++; if ( this.isZwart(xl,yo) ) n++; if ( this.isZwart(x,yo) ) n++; if ( this.isZwart(xr,yo) ) n++; if (xl<0) xl += Breedte; if (xr>=breed) xr -= Breedte; if (yb<0) yb += Hoogte; if (yo>=hoog) yo -= Hoogte; xl xr yb yo
Game of Life meer-cellig “wezen” loopt! stabiel patroon
Methoden BitmapControl nclass BitmapControl : UserControl uBitmapControl uteken// eventhandler voor Paint uklik// eventhandler voor MouseClick ustarten, stoppen // voor animatie-menu uuitvoeren // voor andere menu-keuzes membervariabele: Bitmap model;
class BitmapControl { Bitmap model; public BitmapControl ( ) { } model = new Bitmap(20, 20); this. Paint += teken; this. MouseClick += klik;
class BitmapControl void teken ( object o, PEA pea ) { gr. FillRectangle (br, x, y, 1, 1); } Brush br; if (model.vraag(x,y)) br = Brushes.Red; elsebr = Brushes.White; for (int y=0; y<Hoogte; y++) for (int x=0; x<Breedte; x++) { } int d = this. Diameter; x*d, y*d, d, d );x*d+1, y*d+1, d-1, d-1 ); this. lijnen (gr, d); Graphics gr = pea.Graphics;
class BitmapControl public int Diameter { Size s = this. ClientSize; s.Width / model.Breedte return s.Height / model.Hoogte Math. min (, ); } get { }
class BitmapControl private void lijnen ( Graphics gr, int d) { // horizontale lijnen } // verticale lijnen Pen p = Color.Blue; gr. drawLine ( p, 0, y*d, model.Breedte*d, y*d ); for (int y=0; y <= Hoogte; y++) gr. drawLine ( p, x*d, 0, x*d, model.Hoogte*d ); for (int x=0; x <= Breedte; x++)
class BitmapControl void klik ( object o, MouseEventArgs mea ) { } mea. X mea. Y / diam int diam = this. Diameter; model. verander (, ); mea.Button==MouseButtons.Left this. Invalidate ( );
class BitmapControl void uivoeren ( object sender, EventArgs ea ) { } this. Invalidate ( ); String keus = sender.ToString(); if (keus=="Clear") this.model.Clear(); if (keus=="Left") this.model.Left(); if (keus=="Right") this.model.Right(); if (keus=="Up") this.model.Up(); if (keus=="Down") this.model.Down(); if (keus=="Step") this.model.Step();
class BitmapControl void starten ( object o, EventArgs ea ) { } void stoppen ( object o, EventArgs ea ) { } Thread animatie; animatie = new Thread(animatieFunctie); animatie. Start( ); void animatieFunctie( ) { } this.model.Life( ); this.Invalidate( ); while (true ) { } Thread.Sleep(50); (animatie!=null) { animatie = null;
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