Upload
others
View
7
Download
0
Embed Size (px)
Citation preview
Overerving
ProgrammereninC#
ProgrammereninC# 2
public class Balloon{
private int x = 50;private int y = 50;private int diameter = 20;
public int Diameter {get{return diameter;}set{if (value
Indithoofdstuk…
Eennieuweklassemakenopbasisvaneenbestaandeklasse• Overschrijven:protected vs virtual• Objectklasse• base• Constructor• Abstract klasse• Partial klasse
ProgrammereninC# 3
Inleiding
• Hoehergebruikstimuleren– Eenbestaandeklassedie“bijna”allesdoetwatjewilkanjem.b.v.overervinguitbreiden
ProgrammereninC# 4
Eenbasisklasse:Spherepublic 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 drawArea){
drawArea.DrawEllipse(pen, xCoord, yCoord, 20, 20);}
}
BeschrijftenkelstilstaandeobjectenDezeklassedientalsbasisvoorBubble(afmetingveranderen)endeklasseBall (horizontaalbewegen)
ProgrammereninC# 5
Uitbreiding1
• Steljewilnieuweklassediezeepbellenomschrijft
• Ookinstaatzijnom– afmetingenbelteveranderen– Belverticaaltebewegen
• InplaatsvanklasseSphereteveranderen,nieuweklasseschrijvendiedezeuitbreidt
ProgrammereninC# 6
Eensubklasse: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 void MoveVertical(int amount){yCoord += amount;
}}
ProgrammereninC# 7
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);
}}
Klassediagram
ProgrammereninC# 8
Sphere
Bubble
public partial class Form1 : Form{
Sphere s;Bubble b;
public Form1(){InitializeComponent();b=new Bubble();s=new Sphere();
}
private void button1_Click( object sender, EventArgs e){
b.X = 10;}
}
Kan dit?
Uitbreiding2• SteljewilnieuweklasseBall dieooklinksenrechtskanverplaatsen,11.1
ProgrammereninC# 9
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;
}}
9
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);
}}
Klassediagram
ProgrammereninC# 10
Betekenisvanovererven
• “DitbetekentdatdezeklassealleitemsvandeklasseSphere overerft,behalvedeconstructoren.Bovendienheeftdezeklassetoegang totalleitemsdienietalsprivatebinnendeklasseSphere staanaangegeven”
• Ookdeprivate itemswordendusovergeërfd,zezijnenkelniettoegankelijk
ProgrammereninC# 11
protected• Doel:instantievariabelenbeschikbaarstellenvoorsubklassen• Dus:deklassevoorbereidenophergebruik• Niveaus
– public: overaltoegankelijk– protected: enkeltoegankelijkvanuiteensubklasse
envanuitdeklassezelf– private: enkeltoegankelijkvanuitdeklassezelf
• Lokalevariabelen: bestaanenkelbinnendebodyvaneenmethode
• Dezesleutelwoordenzijneveneensvantoepassingopmethodenenproperties
• Dilemma:wanneermaakikeenvariabeleprivate enwanneerprotected?
à Hergebruik=moeilijkvoorspelbaar
ProgrammereninC# 12
Analogie
• protected Geld– Vrijbeschikbaarvanoudersvoorkinderen,kleinkinderen
• publicGeld– Beschikbaarvooriedereen
• privateGeld– Enkelbeschikbaarvoorjezelf
ProgrammereninC# 13
Sphere
Bubble
Aanvullendeitems
• Desubklassekanvanzelfsprekendaangevuldwordenmetinstantievariabelen,methodesenproperties,netzoalseen“gewone”klasse
• Voorbeelden– radius– Size property– MoveVerticalmethode
ProgrammereninC# 14
Sphere
Bubble
Overschrijven• Methoden/Propertiesuitdebasisklassevaneennieuweimplementatievoorzien
• Voorbeeld:MethodeDisplayinSphereenBubble• Sleutelwoorden– Virtual - Superklasse
• Dezemethode/propertyvandebasisklassekanmogelijkoverschrevenworden
– Override - Subklasse• Dezemethode/propertyvandesubklasseoverschrijfteenmethode/propertyvandebasisklasse
• Dezemethode/propertykanmogelijkopnieuwoverschrevenwordendooreenverderesubklassevandeze(sub)klasse
ProgrammereninC# 15
Sphere
Bubble
Overschrijvenenoverladen
• Verschil?
ProgrammereninC# 16
Indithoofdstuk…
• Overschrijven:protected vs virtual• Objectklasse• base• Constructor• Abstract klasse• Partial klasse
ProgrammereninC# 17
Klassediagram
ProgrammereninC# 18
Object
Sphere
Bubble
ElkeklasseissubklassevanObject.Dientnietexplicietvermeldteworden
System.Object
• Deproperties enmethodesvandezeklassezijnuniverseel(voorelkeklasse)nuttigennoodzakelijk.
• WaaromzoujeToString() willenoverschrijven?– ToString()ismethodediestringrepresentatievanObjectweergeeft
– Indiennietoverschreven isditnaamvanklasse– Doorditinsubklasseteoverschrijvenkanjedeverschillendeinteressanteeigenschappen vaneenobjectweergevendoor1enkelefunctie-oproep
• ZieklasseAnimals
ProgrammereninC# 19
UMLDiagram
Overervingwordtaangeduiddooreengesloten,driehoekigepijl vandesubklassenaardesuperklasse
Sound()à “huh?”
Sound()à “Woefwoef”
Sound()à “Kefkef”
OverervingnoemtmenookweleensdeIS-EENrelatie:“EenSmallDog iseenDog”“EenDogiseenAnimal”“EenSmallDog isookeenAnimal”“NietalleDogszijnSmallDogs!”
ProgrammereninC# 20
Demo- Zelf
ProgrammereninC# 21
1. Animalklasse– PropertyName(Automatic)– OverteschrijvenfunctieSound()->“Euh”– OverschrijvingvanToString()->Name+Sound()
2. Dogklasse– OverervingmetAnimal– ConstructormetStringparametervoorNameintestellen– OvergeschrevenfunctieSound()–>“Woef”
3. MainWindow– InstantievariabelenvanAnimalenDog– GeefpropertyNamevanAnimalinstantieeennaam– Knop
• MessageBox.Show()metoproepvanTstringopinstantievariaelen
...Animal anim1, anim2, anim3;anim1 = new Animal("Woefie");anim2 = new Dog("Pluto");anim3 = new SmallDog("Fifike");
PrintAnimal(anim1);PrintAnimal(anim2);PrintAnimal(anim3);...
private void PrintAnimal(Animal anim){
string line = String.Format("animal ({0}) sounds as: {1}",anim.Name, anim.Sound());
MessageBox.Show(line);}
TestprogrammaWatisdeuitvoer?
ProgrammereninC# 22
Sound()à “huh?”
Sound()à “Woefwoef”
Sound()à “Kefkef”
Regel
• Objectkanmeerderetypeshebben• Bijaanroepvanbepaaldepropertyofmethode– Eerstkijkeninklassezelf– Vervolgensnaardirectesuperklasse– Zoverderinhierarchie
• Indienhetnietgevondenwordt,danfoutmelding
ProgrammereninC# 23
Overervingindepraktijk• Eensubklasseerftsteedsallesovervanalzijnsuperklassen(behalveconstructors;zielater)
• Enkeldeprotected enpublic memberszijnbeschikbaar,deprivate membersblijvenachterdeschermenaanwezig
• Eenklassekanrechtstreeksslechtsvanéénandereklasseovererven(=SingleInheritance)– Java,C#,VB.NET:SingleInheritance– C++:MultipleInheritance
• Deultiemesuperklassewaarelkeandereklassevanovererft:System.Object
ProgrammereninC# 24
Indithoofdstuk…
• Overschrijven:protected vs virtual• Objectklasse• base• Constructor• Abstract klasse• Partial klasse
ProgrammereninC# 25
base
• Indienmethode/propertyinsuperklassezelfdenaamheeft
• Dmv base:Referentienaarhet(onmiddellijke)super-gedeeltevanditobject
• Veelgebruikt:deoverschrevenmethodedoethetzelfdealsdemethodevandesuperklasse+netietsmeer
ProgrammereninC# 26
Voorbeeld
public class Kubus: Vierkant
{public Kubus(int z)
: base(z){ }
public override int Oppervlakte(){
return base.Oppervlakte() * 6;}
}
public class Vierkant{
protected int zijde;
public Vierkant(int z){
this.zijde = z;}
public virtual int Oppervlakte(){
return zijde * zijde;}
}
ProgrammereninC# 27
baseinDemo
• ConstructorinAnimalmetparameter• ConstructorinDogaanpassen• baseinSound()vanDoggebruiken
ProgrammereninC# 28
Indithoofdstuk…
• Overschrijven:protected vs virtual• Objectklasse• base• Constructor• Abstract klasse• Partial klasse
ProgrammereninC# 29
Constructor• Heeftdezelfdenaamalsdeklasse,aanroepmetnew• Alsgeenconstructor isvoorzien– à implicieteendefaultconstructor zonderparams
• Alsjeweleenconstructor voorziet– àmoetjeexplicieteenparameterloze constructordeclarerenindiennodig
• Constructors wordennietovergeërfd!• Eenconstructor vaneensubklasseroeptimplicietdedefaultconstructor vandesuperklasseop,tenzijjeexplicieteenandereconstructor vandeparent klasseaanroept.
ProgrammereninC# 30
Balloon voorbeeldpublic 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}
ProgrammereninC# 31
Balloon voorbeeld
Dezeoproepgebeurtaltijdalseerste,tenzijjeexplicieteenandereconstructor vandeparent oproept.Ditschrijfjebuitendemethod body.
WatzouergebeurenalsinBalloondeconstructor zonderparameterswordtweggelaten?
public class DifferentBalloon : Balloon{
public DifferentBalloon(int initialX,int initialY)
: base(){
xCoord = initialX;yCoord = initialY;radius = 20;
}
// remainder of the class}
ProgrammereninC# 32
Balloon voorbeeldpublic class ModifiedBalloon : Balloon{
public ModifiedBalloon(int initialX,int initialY,int radius)
: base(initialX, initialY, radius){}
// remainder of the class}
Explicieteoproepvandeparentconstructor.
Merkop:dezeconstructordientgedeclareerd,wantconstructorswordennietovergeërfd!
ProgrammereninC# 33
Oefeningen,p216
ProgrammereninC# 34
11.2:ColoredSphereErftSphereoverKleurbijaanmaakinstellen
11.3:Zoekfout
Indithoofdstuk…
• Overschrijven:protected vs virtual• Objectklasse• base• Constructor• Abstract klasse• Partial klasse
ProgrammereninC# 35
Abstracteklassen• Zeerdikwijlszijnbaseklassenvaneeninheritancetreenietinstantieerbaar:– Dezeklassenvoorzienenkelgemeenschappelijkekenmerkenvoorsubklassen,zowelpropertiesalsmethoden
– Dezeklassenvoorzienmethoden/propertieszonderimplementatie,diewelinsubklassenzinvolkunnenwordeningevuld
• Gebruikvanhetsleutelwoordabstract– Inmethode– Inklasse
ProgrammereninC# 36
Gebruikabstracteklassen
• Kijknaarbibklassen:hoehogerinhierarchie• BovenstelaagvanklasseningroteOOprogramma’s
• Ookinbiologie:– zoogdieren
ProgrammereninC# 37
Voorbeeldpublic abstract class Shape{
protected int xCoord, yCoord;protected int size;protected Pen pen = new Pen(Color.Black);
public void MoveRight(){
xCoord += 10;}
public abstract void Display(Graphics drawArea);}
Vandezeklasse kanjegeenobjectenmaken.
Logisch,wanteenshapeheeftfysisch noggeenbetekenis.
ProgrammereninC# 38
Vandezemethodebestaat(nog)geenimplementatie.Dezemoetingevuldwordenindesubklassen.Logisch,wanteenShape ispastoonbaaralswealzijneigenschappenbepaaldhebben.
SubklasseCirclepublic class Circle : Shape{
public override void Display(Graphics drawArea){
drawArea.DrawEllipse(pen, xCoord, yCoord, size, size);}
}
EenCircle iseenShapemeteenconcretevorm.
NukandeDisplaymethodezinvolgeïmplementeerd worden.
ProgrammereninC# 39
Oefening
• Animal,SmallDog,Dog–Welkeklasse/methodeismogelijkabstract?– Pasdecodeaan
ProgrammereninC# 40
Abstractindemo
1. Animalabstract– Klasse header– Soundabstract– Constructorweg
2. Dog– Constructoraanpassen– Soundaanpassen
3. Form– Animalinstantieverwijderen
ProgrammereninC# 41
UMLnotatie
• Abstracteklassenenmethodenwordenschuingedruktweergegeven
ProgrammereninC# 42
Extra: sealed
• Insommigegevallenkanjealsprogrammeurbeslissendatvaneenklassenietmeerkanovergeërfdworden– Veiligheidsoverweging
• Bv.eenklassedieeenmethodeheeftompaswoordentevalideren
• Lethiermeeop,wantjebeperktdushergebruikvanjeklasse!
• Somszijntochzinvollevoorbeeldentevinden:– DeklasseSystem.Math issealed,eenwiskundigefunctieligtvooraltijdvast.
ProgrammereninC# 43
Extra:Voorbeeld
public sealed class SmallDog : Dog{...}
ProgrammereninC# 44
Indithoofdstuk…
• Overschrijven:protected vs virtual• Objectklasse• base• Constructor• Abstract klasse• Partial klasse
ProgrammereninC# 45
Partiëleklassen
• Meestalaparteklasseninapartebestanden• Soms1klasseinverschillendebestanden– Mbvsleutelwoordpartial
• Omdegegenereerdecodenetjestekunnenscheidenvandecodevandeprogrammeur– Geengoedideeomgegenereerdecodeaantepassen
• Vooreigenklassennietaanbevolen
ProgrammereninC# 46
partial
Form1.vb
Form1.Designer.cs
public partial class Form1 : Form{...}
partial class Form1{
private System.ComponentModel.IContainer components = null;
protected override void Dispose(bool disposing){...}
#region Windows Form Designer generated code...
}
ProgrammereninC# 47
Samenvatting
ProgrammereninC# 48
Samenvatting
• Overervingvoorhergebruikvancodetevermijden– Subklasseensuperklasse
• protected• Methodenoverschrijven:virtual,override• baseobjectgebruikeninsubklasse• Constructorinsubklasse• abstractmethodenenklassen• partialklassen
ProgrammereninC# 49
Oefening:11.6
VervolledigProgrammaShapemet- Triangle- Rectangle- Square- CircleMethodevooroppervlakteenvooromtrek
ProgrammereninC# 50
Oefening:11.3
ZetstructuuropvanBankrekeningGoudenRekeningGewoneRekening
ProgrammereninC# 51