Hoofdstuk 8.5 Subklassen
versie-management problematiek Voortborduren op eerder gedaan werk nEerste poging: “knip&plak” class Twee { int x, y; int oud ( ) { return x+y; } } class Twee { int x, y; int oud ( ) { return x+y; } } int z; int nieuw ( ) { return x+y+z; } Drie +1;
raar asymmetrisch veel gedoe Voortborduren op eerder gedaan werk nTweede poging: “doorverwijzen” class Twee { int x, y; int oud ( ) { return x+y; } } class Twee { Twee t; int oud ( ) { return t.oud(); } } int z; int nieuw ( ) { return t.x+t.y+z; } Drie
Voortborduren op eerder gedaan werk nDerde poging: “subklassen” class Twee { int x, y; int oud ( ) { return x+y; } } class Twee : Twee { } int z; int nieuw ( ) { return x+y+z; } Drie
Subklassen nclass Ruimte : UserControl nRuimte is een subklasse van UserControl nUserControl is de superklasse van Ruimte nElk Ruimte-object is tevens UserControl-object nEen Ruimte-object is een bijzonder geval van een UserControl-object
Over-erving nObjecten van een subklasse erven variabelen en methoden&properties van de superklasse kleiner straal CirkelGroei geërfd zelf gede- clareerd groter
Klasse en subklasse class Bolletje { } int x, y, diam; void plaats(int x0, int y0) { this.x = x0; this.y = y0; } void groei( ) { this.diam++; } void teken(Graphics g) { g.DrawEllipse( Pens.Black, x, y, diam, diam ); } class KleurBol : Bolletje { } Color kleur; void verf(Color k) { this.kleur = k; } void teken(Graphics g) { g.FillEllipse( new Brush(kleur), x, y, diam, diam ); } g.DrawEllipse( Pens.Black, x, y, diam, diam ); Bolletje b = new Bolletje(); b.plaats(10,20); b.teken(gr); KleurBol k = new KleurBol(); k.plaats(10,20 ); k.teken(gr); b.verf( Color.Red ); b.groei ( ); k.verf( Color.Green ); base.teken(g); virtual override
Superklassen in libraries nButton : ButtonBase nButtonBase : Control superklasse super- superklasse
property van ContainerControl 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 b = new Button(); f = new Form(); f. Controls. Add(b); t = new TextBox(); f. Controls. Add(t); heeft een Control parameter
Klasse-hiërarchie in Forms PaintEventArgs MouseEventArgs KeyPressEventArgs EventArgs ComponentCommonDialog ControlLabel TrackBar ButtonBase Object String Bitmap Graphics moeder van alle klassen
Hiërarchie-ontwerp ontwerpkeuze: ondergrond gaat voor motorisatie ontwerpkeuze: motorfiets is meer motor dan fiets Vervoer middel Auto Motor Fiets Voertuig Boot Vliegtuig Vracht Wagen Stoom Boot Motor Voertuig Fiets Motor Boot Zeil Boot
Hiërarchie-ontwerp nclass Voertuig :Vervoermiddel class Boot :Vervoermiddel “is een” Vervoer middel Voertuig Boot
class Snelweg : Form { } 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 Snelweg { } Snelweg( ) { Paint += teken; MVoertuig [ ] rijbaan = new MVoertuig [15]; } for (int t=0; t<rijbaan.Length; t++) rijbaan[t] = new Auto(); rijbaan[t] = new VrachtW(); rijbaan[t] = new Combinat(); if ( t%3 != 0 ) else if ( t%6 == 0 ) else
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) { } class Combinat : VrachtW { } void Teken(Graphics g) { } g.FillRect(...); g.FillEllipse(...); g.FillRect(...); g.FillEllipse(...); g.DrawLine(...); g.FillRect(...); g.FillEllipse(...); base. Teken(g); aanhang. Teken(g); Aanhanger aanhang;
class Aanhanger { } void Teken(Graphics g) { } class Combinat : VrachtW { } void Teken(Graphics g) { } g. DrawLine(...); g.FillRect(...); g.FillEllipse(...); g.FillRect(...); g.FillEllipse(...); g.DrawLine(...); g.FillRect(...); g.FillEllipse(...); base. Teken(g); aanhang. Teken(g); Aanhanger aanhang;
MotorVoertuigPersonenAuto VrachtwagenCombinatie class PersonenAuto : MotorVoertuig class VrachtWagen : MotorVoertuig class Combinatie : Vrachtwagen “is een” class Motorvoertuig class Aanhanger Aanhanger : DingOpWielen class DingOpWielen { Aanhanger aanh; } “heeft een” DingOpWielen class Wiel Wiel { Wiel [ ] wielen; }
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
Publieksvraag: Gelijkheid van Strings static bool Gelijk( string s, string t) { } return s==t; Maar dan zonder de bestaande operator == voor strings te gebruiken == voor char en int mag wel
Publieksvraag: Gelijkheid van Strings static bool Gelijk( string s, string t) { } int m = s.Length; int n = t.Length; for (i=0; i<m && i<n; i++) { } char c = s[i]; char d= t[i]; if (c!=d) return false; return m==n;
Gelijkheid van Strings static bool Equals( string s, string t) { } int m = s.Length; int n = t.Length; for (i=0; i<m && i<n; i++) { } char c = s[i]; char d= t[i]; if (c!=d) return false; return m==n; class String { } this.Length; this[i];
Publieksvraag: Ordenen van Strings bool Equals( string t ) { // true als alle letters hetzelfde zijn } class String { } { } int Compare( string t ) // 0 als this en t hetzelfde zijn // positief als this alfabetisch voor t komt // negatief als this alfabetisch na t komt
Gelijkheid van Strings bool Equals ( string t) { } int m = this.Length; int n = t.Length; for (i=0; i<m && i<n; i++) { } char c = this[i]; char d= t[i]; if (c!=d) return false; return m==n; class String { }
Ordenen van Strings bool Equals ( string t) { } int m = this.Length; int n = t.Length; for (i=0; i<m && i<n; i++) { } char c = this[i]; char d= t[i]; if (c!=d) return false; return m==n; class String { } Compareint c - d ; m - n ;
naamtype void () blok parameters methode member
naamtype void operator op () blok parameters methode member
Gelijkheid van Strings static Gelijk ( string s, string t) { } return s.Equals(t); operator == class String { }
naamtype void operator op () blok parameters methode member
naamtype void operator op () blok parameters naam()parameters methode constructor member
naamtype void operator op () blok parameters naam()parameters methode constructor naamtype, =initialisatieconst ; veld member
naamtype void operator op () blok parameters naam()parameters methode constructor naamtype, =initialisatieconst ; veld naamtype{}blok set get member property
naamtype void operator op () blok parameters naam()parameters methode constructor naamtype, =initialisatieconst ; veld naamtype{}blok set get typeparameters[]this indexer member property