130 likes | 346 Views
Kapittel 9. Polymorfi. 9.1 Sein binding. Ofte er det perfekt match mellom typen til ein variabel og objektet han refererer til ChessPiece bishop; ... bishop = new ChessPiece(); Men det må ikkje nødvendigvis vere slik ChessPiece bishop; ... bishop = new Bishop();
E N D
Kapittel 9 Polymorfi
9.1 Sein binding • Ofte er det perfekt match mellom typen til ein variabel og objektet han refererer til • ChessPiece bishop; • ... • bishop = new ChessPiece(); • Men det må ikkje nødvendigvis vere slik • ChessPiece bishop; • ... • bishop = new Bishop(); • Dette er OK dersom Bishop arvar ChessPiece
Sein binding • Polymorfi betyr ‘ha mange former’ • Ein polymorf referanse er ein som kan referere til objekt av ulike klasser over tid • På denne måten kan to metodekall for same variabel gi ulik oppførsel ved at ulike versjonar av same metode blir kjørt
Sein binding • Binding refererer til tidspunktet når eit metodekall blir kopla til koden som skal kjørast • Kan skje under kompilering dersom alt er kjent • Skjer under kjøring når polymorfe referanser er i bruk • Late binding, dynamic binding • Kopling til kode kan ikkje skje før vi veit kva klasse det er snakk om • Kan vere avhengig av inn-data og bli avgjort under kjøring • To måtar å oppnå polymorfi: arv og interface
9.2 Polymorfi ved arv • Vi deklarerer ein variabel med eit spesielt klassenamn • Variabelen kan referere til objekt av denne spesielle klasen • Han kan også referere til objekt av klasser som arver denne spesielle klassen • Eksempel side 483 • Vi må bruke cast om vi vil tilordne eit Mammal-objekt til Horse-referansen • Lite aktuelt i praksis
Polymorfi ved arv • Firm-eksemplet • Klassehierarki der StaffMember er abstrakt • Arv i fleire ledd • Alle har pay() som returnerer ein double • Ekstra data og metoder etter behov • Merk at vi må bruke cast for å kalle metoder som er definert i subklasser
9.3 Polymorfi ved interface • I staden for arv kan vi bruke interface for å oppnå polymorfi • Variable kan deklarerast med namn på eit interface • Ein slik variabel kan referere til objekt av alle klasser som implementerer interfacet • Cast når vi kaller på metoder som er definert på klassenivå (ikkje i interfacet) • Namn på interface kan også brukast som type på parameter til metoder
9.4 Sortering • Typisk område der vi bruker polymorfi • Vi bryr oss ikkje om kva klasse objekta vi sorterer, tilhøyrer • Poenget er at vi kan samanlikne dei • Dermed bruker vi Comparable-interfacet som argumenttype • Sortering er algoritme-stoff som blir behandla grundigare i In295 • Vi går fort gjennom Selection Sort og Insertion Sort
9.5 Søking • Same argument for bruk av polymorfi som ved sortering • Lineært søk • Binærsøk • Kompleksitet? • Meir i In295 og MAT200
9.6 Å designe for polymorfi • Oppførsel varierer med type • Ulike typer kan utføre det same, men på ulike måtar • Polymorfi, arv og interface heng tett saman • Det er ofte liten vits i å bruke arv utan samtidig å legge opp til polymorfi
9.7 Event processing • Korleis blir polymorfi brukt? • Vi lagar ein listener og legg denne til eit grafisk objekt for å fange opp events generert av objektet, f eks ein JButton • Metoden addActionListener() har ingen kjennskap til vår listener-klasse • Interfacet ActionListener er spesifisert som parametertype • Referanser til objekt av alle klasser som implementerer interfacet kan dermed brukast • Om vi lagar ein listener ved arv, så arver vi ein klasse som implementerer ActionListener
9.8 og 9.9 Fleire dialogboksar • File choosers og color choosers er ferdiglaga komponentar for spesielle formål • File chooser for å finne og velge ei fil frå harddisk, cd eller diskett • Color chooser for å velge farge frå ein palett
9.10 Slider • Vi kan bruke ein slider for å la brukaren velge ein verdi innanfor bestemte grenser • Praktisk, sidan vi unngår mange feilsituasjonar • Slideren genererer change events som vi kan fange opp og reagere på