Interfaces - Vrije Universiteit Brussel · Programmeren in C# 2 Abstracte klassen • Iets deels...
Transcript of Interfaces - Vrije Universiteit Brussel · Programmeren in C# 2 Abstracte klassen • Iets deels...
Interfaces
Hoofdstuk23
ProgrammereninC#
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
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
Resultaat
ProgrammereninC# 4
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);}
}
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?
Vraagjes
ProgrammereninC# 7
• Waarvoorstaatabstractclass(waarom,wanneer)?Alsjeabstractweglaat,watmoetjedannogaanpassen?
• SteljehebtnieuweklasseMainWindow– DeclareereninitialiseernueeninstantievariabelevandeklasseShapeendeklasseCircle?
– KanjedefunctieMoveRightlateninwerkenopbeideobjecten?
– ZaldefunctiedrawArea.DrawEllipse(pen, xCoord, yCoord, size, size);problemenopleverenwanneerjezelaatuitvoerenopeenCircleobject?
Indithoofdstuk…
• Interfacesgebruikenvoordestructuurvaneenprogramma– Onderlingeaansluiting,meerdereprogrammeurs– Polymorfie:lijstin1keeritereren
• Interfacesversusabstracteklassen
ProgrammereninC# 8
Inleiding
• Eeninterfacebeschrijftdeuiterlijkeverschijningsvormvaneenklasse– Geenimplementatiesvanmethodesofproperties
• Nietteverwarrenmetgrafischeuserinterface• Doel:– Ondersteunenvanhetontwerp– Bevorderenvanonderlingeaansluiting(eng:cohesion)
• HetconceptinterfacebestaateveneensinJava
ProgrammereninC# 9
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
Interface
• Kangecompileerdwordensamenmetandereklassen–Wordtgechecktofklasseopjuistemanierwordtgebruikt
• Kannietuitgevoerdworden
ProgrammereninC# 11
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; }
}
Interfacesvaninterface
• Interfaceskunnenookoverervenvanandereinterfaces
public interface IColoredBalloon : IBalloon{
void SetColor(Color c);}
ProgrammereninC# 13
Nut1:Aansluiting• Interfaceswordenvaakeerstuitgeschrevenaandehandvaneenanalyse• Vervolgenswordendeinterfacesverdeeldonderdeprogrammeursen
geïmplementeerd• Voorbeeld:
StelJanmoetinterfaceIBalloon implementerenenMiekemoetIGameimplementeren.BovendienheeftMiekedeimplementatievanIBalloonnodig.OmdatjewerktmetinterfaceshoeftMiekeniettewachtenenkanzeonmiddellijk startenmetdeimplementatievanIGame,eventueelgebruikmakendvaneen“Mock”implementatievanIBalloon.Een“Mock”implementatieiseenzeereenvoudigeimplementatiedieweinigofgeenfunctionaliteitbevat,maarlouteralsbedoelingheefttestenofverdereimplementatiestebewerkstelligen.
ProgrammereninC# 14
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
Onderlingeaansluiting
• Hetafsprekenvanstandaardenzorgtervoordatonderlingeuitwisselbaarheidverbetert,bijvoorbeeld:– Stopcontacten– Audio- envideoaansluitingen– DVDstandaarden– …
• Hetconceptinterfacebrengtdezevoordelennaardesoftwarewereld
ProgrammereninC# 16
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
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
Demo
• Maak extraklasse Squaredieinterfaceimplementeert
• Maak lijst inForm1vanIshape• Voeg SquareenBalloonobjectinlijst• Maak button2enlaat alle elementen inlijst in1keer afdrukken
ProgrammereninC# 19
Toepassingvaninterfaces:IList
• EenListBox controlheeftachterdeschermeneenklassediedeitemsbeheert
• DezeklasseiseenimplementatievaneeninterfaceIList
ProgrammereninC# 20
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
Toepassingvaninterfaces:IList
ProgrammereninC# 22
GeeftalsresultaateeninstantievanListBox.ObjectCollectionterug
IList myList = shoppingListBox.Items;
public class ObjectCollection : IList
Verschilmetabstracteklassen1. Eenabstracteklassekanvoorsommigemethodeseen
implementatievoorzien,eeninterfacekanditnooit2. Eenklassekanmeerdereinterfacesimplementeren,
maarslechtsvanéén(abstracte)klasseovererven– Omoverteervenhoeftdeparent klassenietabstracttezijn!
3. Eeninterfacezorgtaltijdenscompilatievoorcontrole,bijeenabstracteklassewordterpastijdensdeuitvoeringgekoppeldmeteenconcretemethode/property
4. Eeninterfacealleenwilnognietzeggendatdezezalgebruiktwordenvoorovererving
ProgrammereninC# 23
Dieren
Waarom?• Dier ->Interface• Vogel->Abstracte klasse• Papegaai ->Klasse
ProgrammereninC# 24
Oefening1:ontwerpbeschrijving
• 23.2– MaakinterfaceIBankrekening– MaakklasseBankrekeningdieIBankrekeningimplementeert
– MaakbasicGUI• GebruikerhaaltbedraguitTextbox• Knopvoorstortingofopname• Labelmetbedragerin
ProgrammereninC# 25
Oefening 2:Dierentuin
• Zorg dat directeur vandierentuin eenoverzicht kan krijgen vanelkdier enzijnbijhorende eigenschappen
• Aparte eigenschappen percategorie– Eet– Zegt
ProgrammereninC# 26
Oefening 3:Experimenteer metcodeCyberSpace Invader(Hfst 20inboek)• Voeg meerdere spelers toe• Voeg verschillende soorten bommen toe• …
ProgrammereninC# 27
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