Interfaces - Vrije Universiteit Brussel · Programmeren in C# 2 Abstracte klassen • Iets deels...

28
Interfaces Hoofdstuk 23 Programmeren in C#

Transcript of Interfaces - Vrije Universiteit Brussel · Programmeren in C# 2 Abstracte klassen • Iets deels...

Page 1: Interfaces - Vrije Universiteit Brussel · Programmeren in C# 2 Abstracte klassen • Iets deels functioneels uitbreiden – Zelfde nut als overerving – Aanroep vastleggenvoor subklassen

Interfaces

Hoofdstuk23

ProgrammereninC#

Page 2: Interfaces - Vrije Universiteit Brussel · Programmeren in C# 2 Abstracte klassen • Iets deels functioneels uitbreiden – Zelfde nut als overerving – Aanroep vastleggenvoor subklassen

Gradaties overervingKlassieke overerving• Iets functioneels

uitbreiden– Codeduplicatie– Niet teveel

aanpassingenaan bestaandecode

• Objecten vansub-ensuperklassen

• Bv.TicketenVIPTicket

ProgrammereninC# 2

Abstracte klassen• Iets deels

functioneelsuitbreiden– Zelfde nutals

overerving– Aanroep

vastleggen voorsubklassen

• Geen objectenvansuperklasse

• Bv.Vorm enRechthoek

Interfaces• Structuur vastleggen

vanklasse– Samenwerking

programmeurs– Lijsten opstellen

metobjectenvanuit zelfdeinterface

– Meervoudigeovererving

• Geen objecten vaninterface,allesabstract

• Bv.IGame,IBalloon

Page 3: Interfaces - Vrije Universiteit Brussel · Programmeren in C# 2 Abstracte klassen • Iets deels functioneels uitbreiden – Zelfde nut als overerving – Aanroep vastleggenvoor subklassen

lpublic class Vierkant{

protected int zijde;

public Vierkant(int z){

this.zijde = z;}

public virtual int Oppervlakte(){

return zijde * zijde;}

}

protected

Herhalingsyntaxklassiekeovererving

public class Kubus: Vierkant

{public Kubus(int z)

: base(z){ }

public override int Oppervlakte(){

return base.Oppervlakte() * 6;}

}

ProgrammereninC# 3

virtual

override

Page 4: Interfaces - Vrije Universiteit Brussel · Programmeren in C# 2 Abstracte klassen • Iets deels functioneels uitbreiden – Zelfde nut als overerving – Aanroep vastleggenvoor subklassen

Resultaat

ProgrammereninC# 4

Page 5: Interfaces - Vrije Universiteit Brussel · Programmeren in C# 2 Abstracte klassen • Iets deels functioneels uitbreiden – Zelfde nut als overerving – Aanroep vastleggenvoor subklassen

Herhalingsyntax:abstracteklassepublic 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.

Geenconstructor

ProgrammereninC# 5

Vandezemethodebestaat(nog)geenimplementatie.Dezemoetingevuldwordenindesubklassen.Logisch,wanteenShape ispastoonbaaralswealzijneigenschappenbepaaldhebben.

public class Circle : Shape{

public override void Display(Graphics drawArea){

drawArea.DrawEllipse(pen, xCoord, yCoord, size, size);}

}

Page 6: Interfaces - Vrije Universiteit Brussel · Programmeren in C# 2 Abstracte klassen • Iets deels functioneels uitbreiden – Zelfde nut als overerving – Aanroep vastleggenvoor subklassen

Vraagjes

ProgrammereninC# 6

• Kanerookstaan?public class Kubus: Vierkant,Shape• Waarvoorstaatjebase(z)inconstructorvanKubus?• Kanjebase(z)weglateninconstructorvanKubus?Indienniet,watmoeter

gebeurenopdatjehettochkanweglaten?• KanjevirtualweglateninklasseVierkant?Indienniet,wanneerkandehet

wel?• MoetoverridedaarstaaninklasseKubus?• Waarvoordientbase.Oppervlakte()?Hoekanjedatweglaten?• SteljehebtnieuweklasseForm1

– Declareer eninitialiseernueeninstantievariabelevandeklasseKubusendeklasseVierkant?

– ToString:• Schrijf functieToStringdieoppervlakteweergeeftvanobjectenKubus enVierkant?• Waarmaakjedezefunctieaan?• GebruikToStringineenMessageBoxbinnen Form1?

– HoekanjebinnenForm1zijdeaanpassenvanVierkantenKubusobject?

Page 7: Interfaces - Vrije Universiteit Brussel · Programmeren in C# 2 Abstracte klassen • Iets deels functioneels uitbreiden – Zelfde nut als overerving – Aanroep vastleggenvoor subklassen

Vraagjes

ProgrammereninC# 7

• Waarvoorstaatabstractclass(waarom,wanneer)?Alsjeabstractweglaat,watmoetjedannogaanpassen?

• SteljehebtnieuweklasseMainWindow– DeclareereninitialiseernueeninstantievariabelevandeklasseShapeendeklasseCircle?

– KanjedefunctieMoveRightlateninwerkenopbeideobjecten?

– ZaldefunctiedrawArea.DrawEllipse(pen, xCoord, yCoord, size, size);problemenopleverenwanneerjezelaatuitvoerenopeenCircleobject?

Page 8: Interfaces - Vrije Universiteit Brussel · Programmeren in C# 2 Abstracte klassen • Iets deels functioneels uitbreiden – Zelfde nut als overerving – Aanroep vastleggenvoor subklassen

Indithoofdstuk…

• Interfacesgebruikenvoordestructuurvaneenprogramma– Onderlingeaansluiting,meerdereprogrammeurs– Polymorfie:lijstin1keeritereren

• Interfacesversusabstracteklassen

ProgrammereninC# 8

Page 9: Interfaces - Vrije Universiteit Brussel · Programmeren in C# 2 Abstracte klassen • Iets deels functioneels uitbreiden – Zelfde nut als overerving – Aanroep vastleggenvoor subklassen

Inleiding

• Eeninterfacebeschrijftdeuiterlijkeverschijningsvormvaneenklasse– Geenimplementatiesvanmethodesofproperties

• Nietteverwarrenmetgrafischeuserinterface• Doel:– Ondersteunenvanhetontwerp– Bevorderenvanonderlingeaansluiting(eng:cohesion)

• HetconceptinterfacebestaateveneensinJava

ProgrammereninC# 9

Page 10: Interfaces - Vrije Universiteit Brussel · Programmeren in C# 2 Abstracte klassen • Iets deels functioneels uitbreiden – Zelfde nut als overerving – Aanroep vastleggenvoor subklassen

Syntaxinterface

• Geenclass sleutelwoord• Geenaccessmodifiers bijmethodenenproperties• Ditispuureenbeschrijvingvandiensten:uiterlijke

verschijningsvormvaneenklasse• Hetbevatgeen implementatie!• get:mogelijkheidtotlezen,set:mogelijkheidtot

schrijvenà ditzijnookgeen implementaties!

public interface IBalloon{

void ChangeSize(int diameter);void Display(Graphics drawArea);int X { get; set; }

}

ProgrammereninC# 10

Page 11: Interfaces - Vrije Universiteit Brussel · Programmeren in C# 2 Abstracte klassen • Iets deels functioneels uitbreiden – Zelfde nut als overerving – Aanroep vastleggenvoor subklassen

Interface

• Kangecompileerdwordensamenmetandereklassen–Wordtgechecktofklasseopjuistemanierwordtgebruikt

• Kannietuitgevoerdworden

ProgrammereninC# 11

Page 12: Interfaces - Vrije Universiteit Brussel · Programmeren in C# 2 Abstracte klassen • Iets deels functioneels uitbreiden – Zelfde nut als overerving – Aanroep vastleggenvoor subklassen

public class Balloon : IBalloon{

private int diameter;private int x, y;

public void ChangeSize(int diameter){

this.diameter = diameter;}

public int X{

get { return x; }set { x = value; }

}

public void Display(Graphics drawArea){

Pen pen = new Pen(Color.Black);drawArea.DrawEllipse(pen, x, y, diameter, diameter);

}}

Eenklassekanéénofmeerdereinterfacesimplementeren

Deklasseisverplicht omallemethodesenpropertiesuitdeinterfacete

implementeren

ProgrammereninC# 12

public interface IBalloon{

void ChangeSize(int diameter);void Display(Graphics drawArea);int X { get; set; }

}

Page 13: Interfaces - Vrije Universiteit Brussel · Programmeren in C# 2 Abstracte klassen • Iets deels functioneels uitbreiden – Zelfde nut als overerving – Aanroep vastleggenvoor subklassen

Interfacesvaninterface

• Interfaceskunnenookoverervenvanandereinterfaces

public interface IColoredBalloon : IBalloon{

void SetColor(Color c);}

ProgrammereninC# 13

Page 14: Interfaces - Vrije Universiteit Brussel · Programmeren in C# 2 Abstracte klassen • Iets deels functioneels uitbreiden – Zelfde nut als overerving – Aanroep vastleggenvoor subklassen

Nut1:Aansluiting• Interfaceswordenvaakeerstuitgeschrevenaandehandvaneenanalyse• Vervolgenswordendeinterfacesverdeeldonderdeprogrammeursen

geïmplementeerd• Voorbeeld:

StelJanmoetinterfaceIBalloon implementerenenMiekemoetIGameimplementeren.BovendienheeftMiekedeimplementatievanIBalloonnodig.OmdatjewerktmetinterfaceshoeftMiekeniettewachtenenkanzeonmiddellijk startenmetdeimplementatievanIGame,eventueelgebruikmakendvaneen“Mock”implementatievanIBalloon.Een“Mock”implementatieiseenzeereenvoudigeimplementatiedieweinigofgeenfunctionaliteitbevat,maarlouteralsbedoelingheefttestenofverdereimplementatiestebewerkstelligen.

ProgrammereninC# 14

Page 15: Interfaces - Vrije Universiteit Brussel · Programmeren in C# 2 Abstracte klassen • Iets deels functioneels uitbreiden – Zelfde nut als overerving – Aanroep vastleggenvoor subklassen

DemoInterface“Spel”waarbij voorwerp randomhorizontaal overschermverplaatst bij elkedrukknop.Stel 3programmeurs:Interface,Voorwerp,Spel

- Interfaceprogrammeurmoetwetenwat spel doet enhoevoorwerp eruit ziet- Spel programmeurmoetwetenwat voorwerp doet

Brainstormmeetingom interfacesvastte leggen vanSpel enVoorwerp.

• IShape ->Balloon– Displayopgraphics,X

• IGame ->Game– ReplacevanIShape opgraphics

• GUI– Gametonen meteen IShape

ProgrammereninC# 15

Page 16: Interfaces - Vrije Universiteit Brussel · Programmeren in C# 2 Abstracte klassen • Iets deels functioneels uitbreiden – Zelfde nut als overerving – Aanroep vastleggenvoor subklassen

Onderlingeaansluiting

• Hetafsprekenvanstandaardenzorgtervoordatonderlingeuitwisselbaarheidverbetert,bijvoorbeeld:– Stopcontacten– Audio- envideoaansluitingen– DVDstandaarden– …

• Hetconceptinterfacebrengtdezevoordelennaardesoftwarewereld

ProgrammereninC# 16

Page 17: Interfaces - Vrije Universiteit Brussel · Programmeren in C# 2 Abstracte klassen • Iets deels functioneels uitbreiden – Zelfde nut als overerving – Aanroep vastleggenvoor subklassen

Nut2:Gezamelijkebehandelingpublic interface IDisplayable{

void Display(Graphics drawArea);}

public class Square : IDisplayable{

private int x, y;private int size;

public void Display(Graphics drawArea){

Pen pen = new Pen(Color.Black);drawArea.DrawRectangle(pen, x, y, size, size);

}

// other methods and properties}

Alleklassendiemoetengetekendkunnenwordenmoetendezeinterfaceimplementeren

ProgrammereninC# 17

Eenklasse diedeinterfaceimplementeert,kanophetschermgetoondworden

Page 18: Interfaces - Vrije Universiteit Brussel · Programmeren in C# 2 Abstracte klassen • Iets deels functioneels uitbreiden – Zelfde nut als overerving – Aanroep vastleggenvoor subklassen

VoorbeeldHetgrotevoordeel isdathetgedeeltevanhetprogrammadatvormenmoettekenen

kangebruikmakenvanpolymorfie (endusenkelopdehoogtemoetzijnvandeinterface)

public class DrawingProgram{

private List<IDisplayable> shapes = new List<IDisplayable>();...public void UpdateScreen(){

foreach (IDisplayable shape in shapes){

shape.Display(myArea);}

}...

}

ProgrammereninC# 18

Page 19: Interfaces - Vrije Universiteit Brussel · Programmeren in C# 2 Abstracte klassen • Iets deels functioneels uitbreiden – Zelfde nut als overerving – Aanroep vastleggenvoor subklassen

Demo

• Maak extraklasse Squaredieinterfaceimplementeert

• Maak lijst inForm1vanIshape• Voeg SquareenBalloonobjectinlijst• Maak button2enlaat alle elementen inlijst in1keer afdrukken

ProgrammereninC# 19

Page 20: Interfaces - Vrije Universiteit Brussel · Programmeren in C# 2 Abstracte klassen • Iets deels functioneels uitbreiden – Zelfde nut als overerving – Aanroep vastleggenvoor subklassen

Toepassingvaninterfaces:IList

• EenListBox controlheeftachterdeschermeneenklassediedeitemsbeheert

• DezeklasseiseenimplementatievaneeninterfaceIList

ProgrammereninC# 20

Page 21: Interfaces - Vrije Universiteit Brussel · Programmeren in C# 2 Abstracte klassen • Iets deels functioneels uitbreiden – Zelfde nut als overerving – Aanroep vastleggenvoor subklassen

Toepassingvaninterfaces:IList

public interface IList: ICollection, IEnumerable

{int Add(object value);void Clear();bool Contains(object value);int IndexOf(object value);void Insert(int index, object value);void Remove(object value);void RemoveAt(int index);

bool IsFixedSize { get; }bool IsReadOnly { get; }object Item(int index) { get; set; }

}

ProgrammereninC# 21

Page 22: Interfaces - Vrije Universiteit Brussel · Programmeren in C# 2 Abstracte klassen • Iets deels functioneels uitbreiden – Zelfde nut als overerving – Aanroep vastleggenvoor subklassen

Toepassingvaninterfaces:IList

ProgrammereninC# 22

GeeftalsresultaateeninstantievanListBox.ObjectCollectionterug

IList myList = shoppingListBox.Items;

public class ObjectCollection : IList

Page 23: Interfaces - Vrije Universiteit Brussel · Programmeren in C# 2 Abstracte klassen • Iets deels functioneels uitbreiden – Zelfde nut als overerving – Aanroep vastleggenvoor subklassen

Verschilmetabstracteklassen1. Eenabstracteklassekanvoorsommigemethodeseen

implementatievoorzien,eeninterfacekanditnooit2. Eenklassekanmeerdereinterfacesimplementeren,

maarslechtsvanéén(abstracte)klasseovererven– Omoverteervenhoeftdeparent klassenietabstracttezijn!

3. Eeninterfacezorgtaltijdenscompilatievoorcontrole,bijeenabstracteklassewordterpastijdensdeuitvoeringgekoppeldmeteenconcretemethode/property

4. Eeninterfacealleenwilnognietzeggendatdezezalgebruiktwordenvoorovererving

ProgrammereninC# 23

Page 24: Interfaces - Vrije Universiteit Brussel · Programmeren in C# 2 Abstracte klassen • Iets deels functioneels uitbreiden – Zelfde nut als overerving – Aanroep vastleggenvoor subklassen

Dieren

Waarom?• Dier ->Interface• Vogel->Abstracte klasse• Papegaai ->Klasse

ProgrammereninC# 24

Page 25: Interfaces - Vrije Universiteit Brussel · Programmeren in C# 2 Abstracte klassen • Iets deels functioneels uitbreiden – Zelfde nut als overerving – Aanroep vastleggenvoor subklassen

Oefening1:ontwerpbeschrijving

• 23.2– MaakinterfaceIBankrekening– MaakklasseBankrekeningdieIBankrekeningimplementeert

– MaakbasicGUI• GebruikerhaaltbedraguitTextbox• Knopvoorstortingofopname• Labelmetbedragerin

ProgrammereninC# 25

Page 26: Interfaces - Vrije Universiteit Brussel · Programmeren in C# 2 Abstracte klassen • Iets deels functioneels uitbreiden – Zelfde nut als overerving – Aanroep vastleggenvoor subklassen

Oefening 2:Dierentuin

• Zorg dat directeur vandierentuin eenoverzicht kan krijgen vanelkdier enzijnbijhorende eigenschappen

• Aparte eigenschappen percategorie– Eet– Zegt

ProgrammereninC# 26

Page 27: Interfaces - Vrije Universiteit Brussel · Programmeren in C# 2 Abstracte klassen • Iets deels functioneels uitbreiden – Zelfde nut als overerving – Aanroep vastleggenvoor subklassen

Oefening 3:Experimenteer metcodeCyberSpace Invader(Hfst 20inboek)• Voeg meerdere spelers toe• Voeg verschillende soorten bommen toe• …

ProgrammereninC# 27

Page 28: Interfaces - Vrije Universiteit Brussel · Programmeren in C# 2 Abstracte klassen • Iets deels functioneels uitbreiden – Zelfde nut als overerving – Aanroep vastleggenvoor subklassen

Oefening4:aansluiting• 23.5

– MaakinterfaceIMyList(Add,IndexOf,Remove)– MaakklasseStringListdieIMyListimplementeert

• IV:Arrayvanstringvariabelen,intlengtevanarray• OverschrijvingvanmethodesAdd,IndexOf,Remove• PropertyPgetomarrayterugtegeven

– MaakbasicGUI• Textboxomtekstintegeven• KnopvoorAdd,Remove,IndexOf• Listboxomlijstintezetten

– CodeachterGUI• IVvanStringLista• Eventachterknop

– listBox1.DataSource=null;listBox1.DataSource=a.P

ProgrammereninC# 28

Kan jeoverervingnemen van- Ilist- List- ArrayList