26 september 2007
Deze les korte herhaling vorige les Unified Modelling Language notatie van een class afleiding pointers abstracte classes polymorphisme dubieuze(?) constructies interfaces
Meer over class deriving Classes kan men ook naast elkaar afleiden:
Classes naast elkaar afleiden: polymorphisme Polymorphisme: letterlijk vertaald: veelvormigheid gebruiken om meerdere varianten van dezelfde class op te bouwen voorbeelden: algemeen: auto, vormen: bmw, audi, etc. algemeen: roofdier, vormen: luipaard, tijger, panter, hond, etc.
In de Java a.p.i. algemeen: component, vormen: jbutton, jframe, jcombobox, etc. algemeen: database connectie, vormen: odbc, mysql, jdbc, etc. algemeen: netwerk connectie, vormen: tcp/ip, slip, cslip, ppp, ftp, etc. e.v.a.
Gebruik Gegeven de klasse auto: fields: private String kleur private int prijs methodes: public void startmotor() public void spuitover(string kleur) Methodes worden overridden in de van auto afgeleide classes (bmw, audi, etc.)
Gedeclareerd en actueel type bmw b = new bmw(); b.startmotor(); Toegestaan?
Gedeclareerd en actueel type bmw b = new bmw(); b.startmotor(); Toegestaan? Ja! auto x = new opel(); x.startmotor(); Toegestaan?
Gedeclareerd en actueel type bmw b = new bmw(); b.startmotor(); Toegestaan? Ja! auto x = new opel(); x.startmotor(); Toegestaan? Ja!
Gedeclareerd en actueel type bmw b = new bmw(); b.startmotor(); Toegestaan? Ja! auto x = new opel(); x.startmotor(); Toegestaan? Ja! auto x vormt het gedeclareerde type opel() vormt het actuele type
Welke methode? auto x = new opel(); x.startmotor(); Welke methode wordt nu aangroepen? opel.startmotor(); auto.startmotor();
Welke methode? auto x = new opel(); x.startmotor(); Welke methode wordt nu aangroepen? opel.startmotor(); auto.startmotor(); Antwoord: de methode van het actuele type, opel.startmotor() dus...
Gebruik De constructie auto x = new opel(); x.startmotor(); is wat dubieus... Waarom zou men dit doen?
Arrays van pointers naar objecten auto[] a = new auto[20]; for(int i=0;i<20;i++) { a[i]= new opel()/bmw()/ferrari()/mazda(); } for int i=0;i<20;i++) { a[i].startmotor(); }
Arrays van pointers naar objecten Met de constructie for int i=0;i<20;i++) { a[i].startmotor(); } roept men in het algemeen de methode startmotor() aan, terwijl deze specifiek gedrag oplevert daar altijd de methode van het actuele wordt aangeroepen...
Problemen In een programma:... bmw x = new bmw(); opel y = new opel(); auto z = new auto();... in bovenstaand programma is een merkloos auto object aangemaakt... niet erg fraai! soms zelfs ronduit gevaarlijk
het keyword abstract Met het keyword abstract kan men een klasse als abstract definiëren. public abstract class auto { //FIELDS... //CONSTRUCTORS... //METHODS... }
De abstracte klasse De abstracte klasse: mag men niet tot een object instantiëren kan alle standaard onderdelen zoals fields, methods en constructors bevatten. Door de klasse auto als abstract te definiëren dwingt men af dat er nooit merkloze auto s in het programma voorkomen. Dit is dus een veilige situatie. Abstracte classes kan men als voorzorgsmaatregel inzetten om te bereiken dat alleen objecten van de afgeleide classes mogen worden gebruikt.
De abstracte methode Een abstracte klasse moet tenminste één abstracte methode hebben: public abstract class auto { //FIELDS... //CONSTRUCTORS... //METHODS public abstract void startmotor(); } Van deze abstracte methodes noteert men alleen hun signatuur
De abstracte methode Door (de signatuur van) een abstracte methode op te nemen in de abstracte klasse, dwingt men de programmeur een implementatie te leveren van deze methode in elke klasse die van de base klasse wordt afgeleid.
De interface De interface: Syntax: kan men opvatten als een abstracte klasse echter: alleen signaturen van abstracte methodes alleen final variabelen public interface x { public final int i=75;... public void doe_iets();... }
Gebruik van interfaces public class c implements x { public void doe_iets() {... weet_ik_veel_wat();... } }
Programmeren per contract Waarom zou men een interface gebruiken? Wat is het nut van interfaces?
Voorbeeld Gegeven de interface mp3speler public interface mp3_speler { public void loadtrack(); public void playtrack(); public void next(); public void previous(); public void stop(); public void fastforward(); public void fastbackward(); }
De klasse mediaspeler public class audiospeler implements mp3speler { public void loadtrack() { bestand openen en laden(); } public void play() { geladen bestand afspelen(); }... }
De klasse winamp public class winamp implements mp3speler { public void loadtrack() { bestand openen en laden(); } public void play() { geladen bestand afspelen(); }... }
De runnable interface Een applet: wordt afgeleid van de JApplet klasse implementeert de Runnable interface De methodes in de Runnable interface dienen dus geïmplementeerd te worden. De Runnable interface wordt gebruikt bij zgn. threads. In de JApplet klasse wordt het starten en stoppen van een thread door de browser geregeld.
Unified Modelling Language visuele taal eigen regels eigen syntax de facto standaard voor o.o.p. U.M.L. is niet: een programmeertaal (u.m.l. produceert een raamwerk, geen algoritmen) een modelerings tool een ontwikkel methode uitontwikkeld
De class Een klasse representeert men met een rechthoek: classnaam attributen operaties
Voorbeeld (analyse) autobedrijf -saldo:int -werkplaats:garage +koopauto() +verkoopauto() +naargarage()
Voorbeeld (ontwerp) autobedrijf -saldo:int -werkplaats:garage +koopauto(auto x):boolean +verkoopauto(auto x):boolean +naargarage(auto x):boolean
Attributen attributen vormen de variabelen in een class kunnen van elk denkbaar type zijn: int float etc. andere classes
Operaties vormen de methodes/functies in een class kunnen parameters hebben kunnen parameters teruggeven
Symbolen - : private access + : public access # : protected access ~: beschikbaar in dezelfde package
Voorbeeld (ontwerp) autobedrijf -saldo[1]:int -/dollars[1]:int -telnummer[1..3]{unique}:string -werkplaats[1]:garage +koopauto(auto x):boolean +verkoopauto(auto x):boolean +naargarage(auto x):boolean / variabele verkregen/opgebouwd uit andere variabelen [] aantal mogelijke waarden van attribuut {unique} geen dubbele waarden
Meer eigenschapen {unique}:geen dubbele waarden {union}:gemeenschappelijke waarden {subsets}:deelverzameling van waarden {redefines}:herdefinitie {ordered}:volgorde van belang {bag}:verzameling waarin dubbele waarden mogen voorkomen {sequence}:bag en ordered {composite}:samengesteld uit andere attributen
Associatie Twee objecten kunnen iets met elkaar te maken hebben. Dit wordt genoteerd middels een rechte lijn: Het soort associatie kan men er in tekst bijzetten Het minimum en maximum aantal objecten plaats men middels getallen aan beide einden.
Ook toegestaan
Aggregatie De ene klasse kan als attribuut een andere klasse hebben. Deze andere klasse kan bestaan zonder de klasse, waarvan deze attribuut is.
Compositie Een klasse a kan niet bestaan zonder de klasse b die klasse a als attribuut heeft dichte diamanten: het ene object kan niet bestaan zonder het andere: compositie open diamanten: het ene object kan bestaan zonder het andere: aggregatie
Generalisatie In het algemeen:
Voorbeeld