Programmeren in C# Overerving
Programmeren in C# 2 public class Balloon private int x = 50; private int y = 50; private int diameter = 20; public int Diameter getreturn diameter; setif (value<100) diameter = value; public Color FillColor get; set; public Balloon(int initialx) x = initialx;y = 50;diameter = 20; public Balloon()x=30; public void MoveRight(int xstep) x = x + xstep; public void ChangeSize(int change) diameter = diameter + change; public partial class Form1 : Form Balloon b; public Form1() InitializeComponent(); b=new Balloon(10); private void button1_click( object sender, EventArgs e) label1.text= Convert.ToString( b.diameter); b.diameter=200; b.fillcolor=color.black; b.changesize(10);
Programmeren in C# 3 In dit hoofdstuk Een nieuwe klasse maken op basis van een bestaande klasse Overschrijven: protectedvs virtual Object klasse base Constructor Abstract klasse Partial klasse
Inleiding Hoe hergebruik stimuleren Een bestaande klasse die bijna alles doet wat je wil kan je m.b.v. overerving uitbreiden Programmeren in C# 4
Programmeren in C# 5 Een basisklasse: Sphere public class Sphere protected int xcoord = 100; protected int ycoord = 100; protected Pen pen = new Pen(Color.Black); public int X set xcoord = value; Beschrijft enkel stilstaande objecten Deze klasse dient als basis voor Bubble (afmeting veranderen) en de klasse Ball (horizontaal bewegen) public int Y set ycoord = value; public virtual void Display(Graphics drawarea) drawarea.drawellipse(pen, xcoord, ycoord, 20, 20);
Uitbreiding 1 Stel je wil nieuwe klasse die zeepbellen omschrijft Ook in staat zijn om afmetingen bel te veranderen Bel verticaal te bewegen In plaats van klasse Sphere te veranderen, nieuwe klasse schrijven die deze uitbreidt Programmeren in C# 6
Een subklasse: Bubble public class Bubble : Sphere protected int radius = 10; public int Size set radius = value; public override void Display(Graphics d) d.drawellipse(pen, xcoord, ycoord, 2*radius,2*radius); public class Sphere protected int xcoord = 100; protected int ycoord = 100; protected Pen pen = new Pen(Color.Black); public int X set xcoord = value; public int Y set ycoord = value; public void MoveVertical(int amount) ycoord += amount; public virtual void Display (Graphics d) d.drawellipse(pen, xcoord, ycoord, 20, 20); Programmeren in C# 7
Programmeren in C# 8 Klassediagram Sphere public partial class Form1 : Form Sphere s; Bubble b; Bubble public Form1() InitializeComponent(); b=new Bubble(); s=new Sphere(); private void button1_click( object sender, EventArgs e) b.x = 10; Kan dit?
Uitbreiding 2 Stel je wil nieuwe klasse Ball die ook links en rechts kan verplaatsen, 11.1 public class Bubble : Sphere protected int radius = 10; public int Size set radius = value; public override void Display(Graphics d) d.drawellipse(pen, xcoord, ycoord, 2*radius,2*radius); public void MoveVertical(int amount) ycoord += amount; public class Sphere protected int xcoord = 100; protected int ycoord = 100; protected Pen pen = new Pen(Color.Black); public int X set xcoord = value; public int Y set ycoord = value; public virtual void Display (Graphics d) d.drawellipse(pen, xcoord, ycoord, 20, 20); Programmeren in C# 9
Klassediagram Programmeren in C# 10
Programmeren in C# 11 Betekenis van overerven Dit betekent dat deze klasse alle items van de klasse Sphere overerft, behalve de constructoren. Bovendien heeft deze klasse toegang tot alle items die niet als private binnen de klasse Sphere staan aangegeven Ook de private items worden dus overgeërfd, ze zijn enkel niet toegankelijk
Programmeren in C# 12 protected Doel: instantievariabelen beschikbaar stellen voor subklassen Dus: de klasse voorbereiden op hergebruik Niveaus public: overal toegankelijk protected: enkel toegankelijk vanuit een subklasse en vanuit de klasse zelf private: enkel toegankelijk vanuit de klasse zelf Lokale variabelen: bestaan enkel binnen de body van een methode Deze sleutelwoorden zijn eveneens van toepassing op methoden en properties Dilemma: wanneer maak ik een variabele private en wanneer protected? à Hergebruik = moeilijk voorspelbaar
Analogie protected Geld Vrij beschikbaar van ouders voor kinderen, kleinkinderen public Geld Beschikbaar voor iedereen private Geld Enkel beschikbaar voor jezelf Sphere Bubble Programmeren in C# 13
Programmeren in C# 14 Aanvullende items De subklasse kan vanzelfsprekend aangevuld worden met instantievariabelen, methodes en properties, net zoals een gewone klasse Voorbeelden radius Size property MoveVertical methode Sphere Bubble
Programmeren in C# 15 Overschrijven Methoden/Properties uit de basisklasse van een nieuwe implementatie voorzien Voorbeeld: Methode Display in Sphere en Bubble Sleutelwoorden Virtual - Superklasse Deze methode/property van de basisklasse kan mogelijk overschreven worden Override - Subklasse Deze methode/property van de subklasse overschrijft een methode/property van de basisklasse Deze methode/property kan mogelijk Sphere Bubble opnieuw overschreven worden door een verdere subklasse van deze (sub)klasse
Programmeren in C# 16 Overschrijven en overladen Verschil?
In dit hoofdstuk Overschrijven: protectedvs virtual Object klasse base Constructor Abstract klasse Partial klasse Programmeren in C# 17
Programmeren in C# 18 Klassediagram Object Sphere Elke klasse is subklasse van Object. Dient niet expliciet vermeld te worden Bubble
System.Object De properties en methodes van deze klasse zijn universeel (voor elke klasse) nuttig en noodzakelijk. Waarom zou je ToString() willen overschrijven? ToString() is methode die string representatie van Object weergeeft Indien niet overschreven is dit naam van klasse Door dit in subklasse te overschrijven kan je de verschillende interessante eigenschappen van een object weergeven door 1 enkele functie-oproep Zie klasse Animals Programmeren in C# 19
Programmeren in C# 20 UML Diagram Sound() à huh? Sound() à Woef woef Overerving wordt aangeduid door een gesloten, driehoekigepijl van de subklassenaarde superklasse Overerving noemt men ook wel eens de IS-EEN relatie: Een SmallDog is een Dog Een Dog is een Animal Een SmallDog is ook een Animal Niet alle Dogs zijn SmallDogs! Sound() à Kef kef
Demo - Zelf 1. Animal klasse Property Name (Automatic) Over te schrijven functie Sound() -> Euh Overschrijving van ToString() -> Name+Sound() 2. Dog klasse Overerving met Animal Constructor met String parameter voor Name in te stellen Overgeschreven functie Sound() > Woef 3. MainWindow Instantievariabelen van Animal en Dog Geef property Name van Animal instantie een naam Knop MessageBox.Show() met oproep van Tstring op instantievariaelen Programmeren in C# 21
Programmeren in C# 22 Wat is de uitvoer? Testprogramma... Animal anim1, anim2, anim3; anim1 = new Animal("Woefie"); anim2 = new Dog("Pluto"); anim3 = new SmallDog("Fifike"); Sound() à huh? Sound() à Woef woef PrintAnimal(anim1); PrintAnimal(anim2); PrintAnimal(anim3);... Sound() à Kef kef private void PrintAnimal(Animal anim) string line = String.Format("animal (0) sounds as: 1", anim.name, anim.sound()); MessageBox.Show(line);
Regel Object kan meerdere types hebben Bij aanroep van bepaalde property of methode Eerst kijken in klasse zelf Vervolgens naar directe superklasse Zo verder in hierarchie Indien het niet gevonden wordt, dan foutmelding Programmeren in C# 23
Programmeren in C# 24 Overerving in de praktijk Een subklasse erft steeds alles over van al zijn superklassen (behalve constructors; zie later) Enkel de protected en public members zijn beschikbaar, de private members blijven achter de schermen aanwezig Een klasse kan rechtstreeks slechts van één andere klasse overerven (= Single Inheritance) Java, C#, VB.NET: Single Inheritance C++: Multiple Inheritance De ultieme superklasse waar elke andere klasse van overerft: System.Object
In dit hoofdstuk Overschrijven: protectedvs virtual Object klasse base Constructor Abstract klasse Partial klasse Programmeren in C# 25
Programmeren in C# 26 base Indien methode/property in superklasse zelfde naam heeft Dmv base: Referentie naar het (onmiddellijke) super-gedeelte van dit object Veel gebruikt: de overschreven methode doet hetzelfde als de methode van de superklasse + net iets meer
Programmeren in C# 27 Voorbeeld public class Vierkant protected int zijde; public Vierkant(int z) this.zijde = z; public virtual int Oppervlakte() return zijde * zijde; public class Kubus : Vierkant public Kubus(int z) : base(z) public override int Oppervlakte() return base.oppervlakte() * 6;
base in Demo Constructor in Animal met parameter Constructor in Dog aanpassen base in Sound() van Dog gebruiken Programmeren in C# 28
In dit hoofdstuk Overschrijven: protectedvs virtual Object klasse base Constructor Abstract klasse Partial klasse Programmeren in C# 29
Programmeren in C# 30 Constructor Heeft dezelfde naam als de klasse, aanroep met new Als geen constructor is voorzien à impliciet een default constructor zonder params Als je wel een constructor voorziet à moet je expliciet een parameterloze constructor declareren indien nodig Constructors worden niet overgeërfd! Een constructor van een subklasse roept impliciet de default constructor van de superklasse op, tenzij je expliciet een andere constructor van de parent klasse aanroept.
Balloon voorbeeld public class Balloon protected int xcoord, ycoord, radius; public Balloon() xcoord = 10; ycoord = 10; radius = 20; public Balloon(int initialx, int initialy, int initialradius) xcoord = initialx; ycoord = initialy; radius = initialradius; // remainder of the class Programmeren in C# 31
Programmeren in C# 32 Balloon voorbeeld public class DifferentBalloon : Balloon public DifferentBalloon(int initialx, int initialy) : base() xcoord = initialx; ycoord = initialy; radius = 20; Deze oproep gebeurt altijd als eerste, tenzij je expliciet een andere constructor van de parent oproept. Dit schrijf je buiten de method body. // remainder of the class Wat zou er gebeuren als in Balloon de constructor zonder parameters wordt weggelaten?
Programmeren in C# 33 Balloon voorbeeld public class ModifiedBalloon : Balloon public ModifiedBalloon(int initialx, int initialy, int radius) : base(initialx, initialy, radius) // remainder of the class Expliciete oproep van de parent constructor. Merk op: deze constructor dient gedeclareerd, want constructors worden niet overgeërfd!
Programmeren in C# 34 Oefeningen, p216 11.2: ColoredSphere Erft Sphere over Kleur bij aanmaak instellen 11.3: Zoek fout
In dit hoofdstuk Overschrijven: protectedvs virtual Object klasse base Constructor Abstract klasse Partial klasse Programmeren in C# 35
Programmeren in C# 36 Abstracte klassen Zeer dikwijls zijn base klassen van een inheritance tree niet instantieerbaar: Deze klassen voorzien enkel gemeenschappelijke kenmerken voor subklassen, zowel properties als methoden Deze klassen voorzien methoden/properties zonder implementatie, die wel in subklassen zinvol kunnen worden ingevuld Gebruik van het sleutelwoord abstract In methode In klasse
Gebruik abstracte klassen Kijk naar bib klassen: hoe hoger in hierarchie Bovenste laag van klassen in grote OO programma s Ook in biologie: zoogdieren Programmeren in C# 37
Programmeren in C# 38 Voorbeeld public abstract class Shape protected int xcoord, ycoord; protected int size; protected Pen pen = new Pen(Color.Black); public void MoveRight() xcoord += 10; Van deze klasse kan je geen objecten maken. Logisch, want een shape heeft fysisch nog geen betekenis. public abstract void Display(Graphics drawarea); Van deze methode bestaat (nog) geen implementatie. Deze moet ingevuld worden in de subklassen. Logisch, want een Shape is pas toonbaar als we al zijn eigenschappen bepaald hebben.
Programmeren in C# 39 Subklasse Circle public class Circle : Shape public override void Display(Graphics drawarea) drawarea.drawellipse(pen, xcoord, ycoord, size, size); Een Circle is een Shape met een concrete vorm. Nu kan de Display methode zinvol geïmplementeerd worden.
Programmeren in C# 40 Oefening Animal, SmallDog, Dog Welke klasse / methode is mogelijk abstract? Pas de code aan
Abstract in demo 1. Animal abstract Klasse header Sound abstract Constructor weg 2. Dog Constructor aanpassen Sound aanpassen 3. Form Animal instantieverwijderen Programmeren in C# 41
Programmeren in C# 42 UML notatie Abstracte klassen en methoden worden schuin gedrukt weergegeven
Programmeren in C# 43 Extra: sealed In sommige gevallen kan je als programmeur beslissen dat van een klasse niet meer kan overgeërfd worden Veiligheidsoverweging Bv. een klasse die een methode heeft om paswoorden te valideren Let hiermee op, want je beperkt dus hergebruik van je klasse! Soms zijn toch zinvolle voorbeelden te vinden: De klasse System.Math is sealed, een wiskundige functie ligt voor altijd vast.
Programmeren in C# 44 Extra: Voorbeeld public sealed class SmallDog : Dog...
In dit hoofdstuk Overschrijven: protectedvs virtual Object klasse base Constructor Abstract klasse Partial klasse Programmeren in C# 45
Partiële klassen Meestal aparte klassen in aparte bestanden Soms 1 klasse in verschillende bestanden Mbv sleutelwoord partial Om de gegenereerde code netjes te kunnen scheiden van de code van de programmeur Geen goed idee om gegenereerde code aan te passen Voor eigen klassen niet aanbevolen Programmeren in C# 46
Programmeren in C# 47 partial public partial class Form1 : Form... Form1.vb partial class Form1 private System.ComponentModel.IContainer components = null; protected override void Dispose(bool disposing)... #region Windows Form Designer generated code... Form1.Designer.cs
Samenvatting Programmeren in C# 48
Programmeren in C# 49 Samenvatting Overerving voor hergebruik van code te vermijden Subklasse en superklasse protected Methoden overschrijven: virtual, override base object gebruiken in subklasse Constructor in subklasse abstract methoden en klassen partial klassen
Oefening: 11.6 Vervolledig Programma Shape met - Triangle - Rectangle - Square - Circle Methode voor oppervlakte en voor omtrek Programmeren in C# 50
Oefening: 11.3 Zet structuur op van Bankrekening GoudenRekening GewoneRekening Programmeren in C# 51