overerving - vrije universiteit brussel · overerving in de praktijk • een subklasse erft steeds...

51
Overerving Programmeren in C#

Upload: others

Post on 26-Jan-2021

5 views

Category:

Documents


0 download

TRANSCRIPT

  • 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