Arv

  • Uploaded by: hallvard
  • 0
  • 0
  • April 2020
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Arv as PDF for free.

More details

  • Words: 3,139
  • Pages: 55
Læringsmål for forelesningen • Objektorientering – Arv

• Java­programmering – Arv i Java

• Eclipse – Undersøke klassehierarki i Eclipse

1

 

 

Arv (eng: inheritance) • Er en fundamental OO­mekanisme • Arv gir muligheten til definere nye klasser,  basert på eksisterende – vi kan utvide eksisterende klasser – spesialisere eksisterende klasser

• En slik såkalt subklasse, arver alle  egenskapene til superklassen

– instanser av subklassen vil inneholde alle felt og metoder (inkl.  konstruktører) deklarert i både superklassen og subklassen – alle grensesnitt arves, dvs. garanti for implementerte metoder – alle public­ og protected­felt og ­metoder deklarerert i  superklassen, kan refereres til i subklassens kode

2

 

 

Hvorfor arv? • Klassifisering i  klassehierarkier er  en intuitiv organisering  av fenomener i verden

pattedyr hovdyr

– hovdyr er et pattedyr – katt og hund er et rovdyr er et pattedyr – gnager er et pattedyr

rovdyr

katter

gnagere

hunder

• Arv gir mulighet for gjenbruk av kode • Forenkler strukturering av komplekse problemer og  programmer  • 3

 

Mange mener at arv må støttes for at et programmeringsspråk skal  være “ekte” objekt­orientert  

Exception Exception­hierarki RuntimeEx.

IOEx. FileNotFoundEx.

4

IllegalArgumentEx.

NullPointerEx.

NumberFormatEx.

IndexOutOfBoundsEx.

StringI.O.O.B.Ex.  

ArrayI.O.O.B.Ex.  

http://www.falkhausen.de/en/diagram/html/java.util.Collection.html 5

 

   

Lynkurs i arv

Object

• Klasser struktureres  i et hierarki, f.eks.  C1 C2 C1, C11, C12, C2,  C21, C22 • Et objekt laget som  C21 C22 C11 C12 en instans av en  peker på superklassen klasse C, er  instanceof C  og alle C sine  C21 c21 = new C21(); superklasser 6

c21 instanceof C2 = = true

 

 

Typisk to typer bruk av arv • Spesialisering av eksisterende klasse(r) – noen har allerede laget en eller flere klasser i et hierarki, og vår  subklasse skal spesialisere den som passer best – eksempler: • Exception/RuntimeException • JComponent/JPanel

• Vi lager vårt eget klassehierarki, med tett  koblede klasser – superklasse Bok, subklasser Ordbok og Tegneseriealbum

7

 

 

Spesialisering/subklassing av eksisterende klasse(r) • Utgangspunkt: – Eksisterende klassehierarki – Andre klasser som bruker klassene i hierarkiet på en  veldefinert måte

• Eksempler: – Object, +­operatoren og OutputStream/Writer­klassene – Exception/RuntimeException og unntakssystemet – JComponent/JPanel og Swing 8

 

 

Object, +­operatoren og  OutputStream/Writer­klassene • Object

– implisitt superklassen til alle klasser – definerer en del metoder, inkl. String toString(), som alle klasser forventer at finnes

• +­operatoren baserer seg på at toString­metoden kan  brukes for å lage en tekstlig representasjon av et objekt – ”hei” + obj betyr omtrent ”hei”.concat(obj.toString())

• OutputStream/Writer­klassene baserer seg på toString­ metoden

– når en skriver ut objekter, så vil toString­metoden bli brukt til å konvertere objektet  til tekst

• Ved riktig redefinering av toString() så vil vår egen  (Object­sub)klasse gli pent inn i Java sin objekt­til­tekst­ konverteringsmekanisme 9

 

 

Redefinering av toString() • public class Person { private String name; public String toString() { return ”[Person ” + name + ”]”; } } #1: Person

Object­del Person­del

• 10

 

String toString() { ... } boolean equals(Object) { ... } String toString() { ... } String name =

Person har nå to toString()-metoder, men kun den i subklassen er synlig utenifra – –

en metode i en subklasse skygger for en metode med samme navn og parametre i superklassens subklassen kan referere til superklassens ved bruk av super.toString()  

Exception/RuntimeException og  unntakssystemet • throw, catch og throws forventer en Exception­ instans – throw new IllegalArgumentException(...) – catch (IllegalArgumentException iae) – throws IllegalArgumentException

• Viktig distinksjon mellom checked og unchecked  exceptions: – RuntimeException og subklassene er unchecked – Exception og andre subklasser er checked

• Ved riktig bruk av subklassing (visse regler må  overholdes) så vil vår egen (Runtime)Exception­ subklasse gli pent inn i Java sitt unntakssystem 11

 

 

NameValidationException • Person har en setName­metode og regler for  hvilke tegn som tillates i et navn • Hvis reglene ikke overholdes, så skal det kastes en  ny type unntak: NameValidationException • NameValidationException lagrer informasjon om  det nye (ulovlige navnet) og Person­objektet • Ved å subklasse riktig Exception­(sub)klasse, så  vil vår klasse blir brukt av  unntakshåndteringsmekanismen på ønsket måte – checked eller unchecked – riktig logiske klassifisering

12

 

 

NameValidationException •

public class NameValidationException extends IllegalArgumentException { private Person person; private String illegalName;

}

public NameValidationException(Person person, String illegalName) { this.person = person; this.illegalName = illegalName; } public String getMessage() { return illegalName + ” is an illegal name for ” + person; }

#1: NameValidationException

Object ­del

String toString() { ... }

Ill.Arg.Exc. ­del

String toString() { ... } String getMessage() { ... } String getMessage() { ... }

NameVal.Exc.­del 13

 

Person person = String name =

 

Hierarchy­view •

Hvordan ser objektet vårt ut?



Velg klassenavnet og trykk F4

#1: NameValidationException

Object ­del

String toString() { ... }

Ill.Arg.Exc. ­del

String toString() { ... } String getMessage() { ... } String getMessage() { ... }

NameVal.Exc.­del 14

Person person = String name =

 

 

Sekvensdiagram #1: NameValidationException

1: toString() // Throwable sin metode 1.1: getLocalizedMessage() // Throwable sin metode 1.1.1: getMessage() // NameValidationException sin metode

• Ved å redefinere riktig metode kan vi skyte vår egen  kode inn i en kallsekvens på strategisk riktig sted • Dette krever at vi forstår hvordan superklassen bruker  sine egne metoder 15

 

 

JComponent/JPanel og Swing • JComponent er en generell GUI­element­klasse • JComponent har en del paint­metoder som kalles  av Swing for å tegne innholdet i GUI­elementet – public void paint(Graphic g) kaller

• protected void paintBorder(Graphics g) • protected void paintComponent(Graphics g) • protected void paintChildren(Graphics g)

• Med subklassing og redefinering av riktig paint­ metode så kan vi lage våre egne GUI­elementer

16

 

 

Sekvensdiagram #1: JComponent 1: paint() 1.1: paintComponent 1.2: paintBorder

paint kaller ­ paintComponent  ­ paintBorder ­ paintChildren

1.3: paintChildren

17

• paintComponent er den som er ”riktigst” å redefinere,  siden paint gjør viktig håndtering av Graphics­objektet  og paintBorder ikke trenger å endres på.   

 

Redefinering av metoder i Eclipse

18

 

 

MyComponent, alt. 1 • liste av firkanter, som tegnes i en løkke

19

 

 

MyComponent, alt. 2 • liste av firkanter, som tegnes i en løkke • utnytter at – Graphics­argumentet alltid er en Graphics2D, som kan litt mer – En Rectangle er en Shape, som kan brukes som argument til  Graphics2D sin draw­metode

20

 

 

Eget klassehierarki, med tett koblede klasser • En bok har en tittel • Ordbøker og tegneseriealbum er bøker – Bok er et generelt begrep, med sine felter – En ordbok er en spesiell type bok

• lar Ordbok­klassen arve egenskaper fra Bok­klassen • definerer i tillegg feltet antallOrd

– Et tegneseriealbum er også en bok • lar Tegneseriealbum­klassen arve egenskaper fra Bok­klassen • definerer i tillegg feltet antallStriper 21

 

 

Ordbok og Tegneseriealbum arver fra Bok • Ordbok – extends Bok, arver dermed tittel­feltet – definerer også eget antallOrd­felt

• Tegneseriealbum – extends Bok, arver dermed tittel­feltet – definerer også eget antallStriper­felt 22

 

 

Definere subklasse • Ny klasse Ordbok • Bok er superclass

23

• Legger til extends Bok

 

 

Begreper knyttet til arv  • Vi sier at Bok er superklassen til Ordbok og  Tegneseriealbum, mens Ordbok og  Tegneseriealbum er subklasser av Bok • Ordbok og Tegneseriealbum er  spesialiseringer av Bok Bok String tittel • Bok er en generalisering av Ordbok og Ordbok Tegneseriealbum Tegneseriealbum int antallOrd

24

 

int antallStriper

 

Instanser og klassetilhørighet • Et objekt instansieres av én  bestemt klasse • Objektet har alle egenskaper  definert i denne klassen og  (alle) dens superklasse(r)

25

#1: Bok tittel = ”Sofies verden” #2: Ordbok tittel = ”Riksmålsordboken” antallOrd = 32768

– #1 er en Bok og har feltet tittel Ordbok­del – #2 er en Ordbok og har Bok­del feltene tittel og antallOrd #2: – #3 er et Tegneseriealbum og har Tegneseriealbum feltene tittel og  tittel = ”Flat firer” antallStriper antallStriper = 128 Tegneseriealbum­del

 

 

Instanser og klassetilhørighet • Vi kan si at et objekt også er en X,  dersom X er (en av) superklassen(e) – #1 er Bok, #2 er både Ordbok og Bok og #3 er både Tegneseriealbum og Bok

• Arving av egenskaper sikrer at Ordbok­objekter og Tegneseriealbum for alle praktiske formål er Bok­objekter

Bok­del 26

 

Tegneseriealbum­del

#1: Bok tittel = ”Sofies verden” #2: Ordbok tittel = ”Riksmålsordboken” antallOrd = 32768

Ordbok­del #2: Tegneseriealbum tittel = ”Flat firer” antallStriper = 128  

Instanser i Eclipse • Sette breakpoint • Kjøre i debug­modus • Bok­subklasser har tittel­ felt og felt definert i egen klasse 27

 

 

Arv av metoder (1) • En subklasse arver alle egenskaper til  superklassen – felter – vanlige metoder – konstruktører arves ikke direkte, men kan brukes av subklassens konstruktør

• Metodene som arves fra en superklasse, kan  kun bruke felt som er definert i  superklassen 28

– f.eks. vil get­ og set­metoder i Bok virke som før, de leser og setter felter i Bok­delen av en Ordbok  

 

Arv av metoder (2) • Flere metoder vi har brukt er egentlig arvet – toString­metoden, som alle objekter har, er egentlig arvet fra  java.lang.Object – assertXXX­metodene, som en finner i JUnit­testene til  JExercise, er arvet fra TestCase­klassen i JUnit­rammeverket

• Dersom en definerer samme metode i en  subklasse, vil denne brukes istedenfor den i  superklassen, jfr. egendefinerte toString­ metoder • Vi sier at en metode som er redefinert i en  subklasse, skygger for den i superklassen 29

 

 

Arving og redefinering av toString­metoden Run

• Redefinerer toString i Bok­klassen: Run

• Redefinerer toString i Ordbok­klassen: Run 30

 

 

Typer, referanser og instanser (1) • To måter å tenke på typer og variabler,  parametre, felter og returverdier – Typen garanterer hva objektet den refererer til har av  egenskaper – Typen begrenser hva slags objekt den kan ha som verdi

• Typen til en variabel/felt avgjør hvilke felt og  metoder det er tillatt å bruke

– Dersom bokaMi er deklarert som Bok, vil bokaMi.tittel være lov, men ikke bok.antallStriper, selv om bokaMi faktisk refererer til en Tegneseriealbum­instans

31

 

 

Typer, referanser og instanser (2) • For å kunne garantere at et objekt har de nødvendige  egenskapene, må en også begrense hva en variabel/felt  kan referere til – Dersom bokaMi er deklarert som Ordbok, kan den ikke referere til (dvs.  tilordnes) et objekt som kun er en Bok.

• En variabel/felt deklarert av type X kan referere til  objekter av type Y, dersom Y er X eller subklasse av X

– En Bok­variabel/felt kan referere til Bok­, Ordbok­ og Tegneseriealbum­objekter,  mens en Object­variabel/felt kan referere til alle type objekter!

• Siden Y har arvet alle egenskapene til X, sikrer det at Y har de garanterte evnene

– En Ordbok­instans kan for alle praktiske formål brukes som en Bok­instans, siden  alle Ordbok­instanser har alle Bok­egenskapene

32

 

 

Typer, referanser og instanser (3) • instanceof­operatoren ( instanceof  ) sjekker om  er av en bestemt klasse,  uavhengig av typen til ­uttrykket • Tabellen viser hvilke objekter som gir true for hvilke  typer: – Object o1 = new Bok(); – Object o2 = new Ordbok(); – Object o3 = new Tegneseriealbum();

instanceof

33

 

o1: Bok

o2: Ordbok

o3: Tegneserie

instanceof Object

?

?

?

instanceof Bok

?

?

?

instanceof Ordbok

?

?

?

instanceof Tegneseriealbum

?

?

?  

Typer, referanser og instanser (3) • instanceof­operatoren ( instanceof  ) sjekker om  er av en bestemt klasse,  uavhengig av typen til ­uttrykket • Tabellen viser hvilke objekter som gir true for hvilke  typer: – Object o1 = new Bok(); – Object o2 = new Ordbok(); – Object o3 = new Tegneseriealbum();

instanceof

34

 

o1: Bok

o2: Ordbok

o3: Tegneserie

instanceof Object

true

true

true

instanceof Bok

true

true

true

instanceof Ordbok

false

true

false

instanceof Tegneseriealbum

false

false

true  

instanceof og casting • instanceof brukes typisk for å sjekke at bruk av et objekts spesifikke  felter og metoder er lov: – Bok bok = new Ordbok(); ... if (bok instanceof Ordbok) { System.out.println(bok.getAntallOrd()); } • •

Vi vet at koden er logisk grei, men det er likevel ikke lov, siden typen til  bok fortsatt ikke kan garantere at objektet har getAntallOrd­metoden Etter å ha testet typen til et objekt, må vi bruke ”casting” for å garantere  overfor Java at objektet har den nødvendige typen, før egenskapen brukes:

• if (bok instanceof Ordbok) { System.out.println(((Ordbok)bok).getAntallOrd()); } 35

 

 

instanceof og casting • Casting tvinger Java til å akseptere at en  objekt(referanse) er av annen (mer  spesialisert) type enn deklarasjonen  garanterer

– Casting til subklasse kalles downcasting, som er det mest vanlige – Casting til superklasse kalles upcasting, som en sjelden gang kan  være nyttig

• objekt kan castes til X dersom objekt instanceof X er true, ellers får en  ClassCastException 36

 

 

Hva vil det altså si å arve? • En klasse definerer egenskaper, i form av  felter og metoder, som instansene vil få • Ved arving/subklassing vil alle  egenskapene definert i superklassen også  gjelde for subklassen • Ekstra egenskaper definert i subklassen  legges til de som er definert i superklassen 37

 

 

Hva med innkapsling? • Innkapslingsprinsippet gjelder fortsatt. • En ny synlighetsmodifikator:  protected  innføres for å definere hvilke  egenskaper i superklassen som blir  synlige i subklassene 38

 

 

Synlighet av arvede egenskaper • Arv krever introduksjon av en ny grad av  synlighet, mellom public og private • Egenskaper markert som protected i en  superklasse er synlige kun i subklassene

– felter markert med protected kan både leses og endres i  subklassen – metoder markert med protected kan både kalles og redefineres  i subklassen

• Merk forskjellen mellom synlighet og eksistens:

– et private­felt er ikke synlig i subklassens kode, men finnes fortsatt – en private­metode er ikke synlig i subklassens kode, men finnes  fortsatt og kan kalles indirekte via synlig metoder

39

 

 

Synlighet av arvede egenskaper • NB! protected­egenskaper skaper  en tettere og ofte uønsket binding  mellom super­ og subklasser – protected skal brukes i tilfeller hvor direkte tilgang  til superklassens egenskaper er nødvendig – metoder som det er meningen/naturlig at skal  redefineres i subklasser bør markeres som  protected – felter bør kun i nødsfall markeres som protected 40

 

 

Innkapsling og arv klasse Methods Client, med tilgang til  public­ metoder

Egenskaper markert med protected er synlig i subklassen

subklasse Methods

41

 

Data

Data  

Mer om redefinering av metoder  (eng: overriding)  • Ved subklassing arves både felter og metoder. • Arv av metoder gjør det mulig å bruke superklassens  metoder på instanser av en subklasse

– toString­metoden definert i Object kan brukes på alle instanser av alle klasser – getTittel­metoden definert i Bok kan brukes på alle Ordbok­instanser

• Dersom en ønsker å erstatte en arvet metode med en egen  implementasjon, defineres bare en metode med samme  synlighet, returverdi og parameter i subklassen – Bok kan definere en alternativ toString­metode med signaturen public String toString(), som setter sammen relevante Bok­felter

42

 

 

Redefinering av metoder • Redefinerte metoder skygger for arvede, slik at metoden  definert i subklassen kalles istedenfor den i superklassen – Bok sin toString­metode blir brukt istedenfor den som er arvet fra Object

• Hvilken metode som kalles er avhengig av klassen som  objektet er laget av, ikke typen til referansen – Ordbok ordbok = new Ordbok(); // kaller toString-metoden definert i Ordbok System.out.println(ordbok); Bok bok = ordbok; // kaller fortsatt toString-metoden definert i Ordbok System.out.println(bok);

43

Object objekt = bok; // kaller fortsatt toString-metoden definert i Ordbok System.out.println(objekt);  

 

Redefinering av metoder • Det er det faktiske objektet som avgjør  hvilken metode som velges, ikke typen  til uttrykket, men typen til uttrykket  begrenser hvilke metoder som kan  brukes • Skygging av metoder kan imidlertid  være problematisk... 44

 

 

Legger til valideringskode i Bok  sin setTittel­metode • Sjekker om tittelen inneholder ulovlige bokstaver

• Det er viktig at subklasser ikke omgår denne  sjekken, men er med på å sikre at reglene for Bok  sin oppførsel følges 45

 

 

Oppgave: Definer en alternativ  setTittel­metode for Ordbok, som  sikrer at tittelen til en Ordbok slutter  på ”ordbok” Sjekker om tittel slutter på  ”ordbok” og i tilfelle ikke, legger  til ”ordbok” 46

 

 

Alternativ setTittel­metode • Redefinerer setTittel i Ordbok­klassen: – samme signatur som setTittel i Bok­klassen – sjekker endelsen og legger evt. til ”ordbok”­endelsen

• To problemer:

– tittel­feltet må være protected og ikke private, for at  Ordbok sin setTittel­metode skal kunne endre tittel­feltet – Bok sin setTittel­metode inneholder egen valideringskode, som  burde vært duplisert i Ordbok sin setTittel­metode

• Forslag til løsning? 47

 

 

Ved redefinering av en metode i en subklasse, hadde det vært fint å kunne bruke  superklassen sin metode, slik at en  slipper å duplisere kode (og logikk) Java gir oss muligheten til å kalle  metoder i superklassen fra en  subklasse, selv disse er redefinert i  subklassen 48

 

 

super.<metode>(...)­ konstruksjonen • Med super som prefiks kan en kalle en metode i superklassen, selv om denne er redefinert i subklassen! • Dette løser begge våre problemer

– vi kan deklarere tittel­feltet som private, siden vi kan sette den vha.  Bok (altså superklassen) sin setTittel­metode – vi kan kalle Bok sin setTittel­metode med en evt. endret tittel, og være  sikker på at denne valideres iht. Bok sine egne regler

• Merk at super.<metode>(...)

– kan kalles fra alle metoder i subklassen, ikke bare fra <metode> – kun kan brukes for å kalle metoder definert i den direkte superklassen, og  ikke metoder i super­superklassen

49

• this­referansen vil være den samme

 

 

super gjør det mulig å (gjen)bruke  superklassens metoder, selv om de  redefineres i subklassen Det er som om Ordbok består  av én Bok­ eller super­del og  én egen Ordbok­del, og super  gir mulighet til å referere til  metoder i super­delen 50

 

super­ del egen del

#1: Ordbok ... void setTittel(String) super

... void setTittel(String)

 

Redefinering av konstruktører • En konstruktør er en spesiell metode som kalles ifm.  initialisering av en nyopprettet instans. • super(...) MÅ brukes for å kalle superklassens  konstruktør, slik at en sikrer at også super­delen blir riktig  og skikkelig initialisert. • super(...) MÅ stå først i konstruktøren, for å sikre at  superklassens felter initialiseres før subklassens! • I Bok­klassen:

– initialiserer tittel­feltet

• I Ordbok­klassen:

51

 

– kaller superklassen sin konstruktør – initialiserer antallOrd­feltet – alternativt kunne en fjernet antallOrd­parametret og initialiseringen av det, men konstruktøren MÅ defineres

 

Kallsekvens • main­metode – lager en Ordbok­instans og endrer tittelen

52

 

 

Redefinering vs. overlasting (overriding vs. overloading) • Redefinering

– Metoder med like parameterlister (og returtyper) i ulike super­ og  subklasser – Hvilken faktisk instans metoden kalles på, avgjør hvilken metode som  kalles – Metoden som kalles avgjøres dynamisk ved utførelsen

• Overlasting

– Metoder med ulike parameterlister (antall og type), som ikke har annet  felles enn navnet. – Hvilken metode(variant) som kalles, avgjøres av den deklarerte typen til  parametrene – Metoden som kalles avgjøres statisk ved kompilering

• Ved kombinasjon av overlasting og redefinering

– først brukes de deklarerte typene til parameterlista tilsvarende overlasting – deretter kalles den mest spesifikke metoden på instansen

53

 

 

Konstruktører kan også  overlastes • Flere konstuktører med ulike parameterlister kan defineres • En konstruktør kan kalle en annen definert i samme klasse  med this(...) • this(...)­konstruksjonen er analogt med bruk av super(...): Den navnløse konstruktørmetoden i egen (this) eller superklassen (super) kalles • NB! Dersom en konstruktør må kalle en annen, må dette  skje i første linje!!! 54

 

 

Læringsmål for forelesningen • Objektorientering – Arv

• Java­programmering – Arv i Java

• Eclipse – Undersøke instanser i Eclipse

55

 

 

Related Documents

Arv
April 2020 14
Arv
November 2019 11
Java Swing Uten Arv
April 2020 7
Unntak Nesten Uten Arv
April 2020 15
Arv Hiv Aids Dian.pptx
December 2019 33

More Documents from ""

Innkapslingseksempel
December 2019 14
Interface
December 2019 61
Enum
December 2019 19
Ark-modellen
December 2019 19
Rpn Kalkulator
December 2019 12