objektorienteret programmering

21
FEN 2008-09-03 NOEA - Nordjyllands Erhvervsak ademi 1 Objektorienteret programmering Indkapsling Arv og polymorfi (OOP’s 3 hovedprincipper)

Upload: salma

Post on 15-Jan-2016

58 views

Category:

Documents


1 download

DESCRIPTION

Objektorienteret programmering. Indkapsling Arv og polymorfi (OOP’s 3 hovedprincipper). OO-Principper -indkapsling. Et objekt er (set udefra) en atomar enhed der tilbyder en række services (metoder/properties). - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Objektorienteret programmering

FEN 2008-09-03 NOEA - Nordjyllands Erhvervsakademi 1

Objektorienteret programmering

Indkapsling

Arv og polymorfi

(OOP’s 3 hovedprincipper)

Page 2: Objektorienteret programmering

FEN 2008-09-03 NOEA - Nordjyllands Erhvervsakademi 2

OO-Principper-indkapsling

• Et objekt er (set udefra) en atomar enhed der tilbyder en række services (metoder/properties).

• Det at gøre detaljerne i objekters implementation utilgængelige kaldes information hiding.

• Det at gruppere data sammen med operationer på disse data under praktisering af information hiding kaldes indkapsling eller dataabstraktion.

• Indkapsling er et af hovedprincipperne i OOP

Page 3: Objektorienteret programmering

FEN 2008-09-03 NOEA - Nordjyllands Erhvervsakademi 3

• Alle metoder bortset fra constructors arves.• private medlemmer af basisklassen nedarves,

men kan ikke tilgås direkte.• Alle protected medlemmer af basisklassen er

synlige nedad i arvehierakiet, men private for alle klasser udenfor.

• Der kan tilføjes attributter og metoder i den nedarvede klasse

• Ingen multipel arv• I C# arver alle klasser fra object

CheckKonto

Konto

OO-Principper-nedarvning

Page 4: Objektorienteret programmering

FEN 2008-09-03 NOEA - Nordjyllands Erhvervsakademi 4

OO-Principper-nedarvning

• Nedarvning understøtter kodegenbrug• Nedarvning gør det muligt at udvide en

eksisterende klasse.• Nedarvning er typespecialisering, dvs. vi

modellerer et ”er-en” forhold mellem den nedarvede klasse og den der arves fra - fx: en Checkkonto er-en Konto.

• Hvis vi står og mangler en klasse som er en specialisering af en klasse vi har, kan vi anvende nedarvning.

• Fx Konto -> CheckKonto

CheckKonto

Konto

Page 5: Objektorienteret programmering

FEN 2008-09-03 NOEA - Nordjyllands Erhvervsakademi 5

OO-Principper-nedarvning

• Den der arves fra kaldes basisklasse/superklasse.

• Den der arver kaldes subklasse• Husk at der gælder et er-en forhold mellem

sub- og basisklassen• En nedarvet klasse er typekompatibel med

basisklassen:CheckKonto ck = new CheckKonto();If (ck is Konto)

//returnerer true hvis CheckKonto arver fra Konto• Er-en forholdet er transitivt.

CheckKonto

Konto

Page 6: Objektorienteret programmering

FEN 2008-09-03 NOEA - Nordjyllands Erhvervsakademi 6

Udvidelse af domænemodellen

Projekt

navnafdeling

ArbejderPaa

timer10..* 10..*

Ansat

navnstillingløn 1 0..*1 0..*

Chef

antalOptioner

Sælger

antalSolgteEksemplarer Kode

Page 7: Objektorienteret programmering

FEN 2008-09-03 NOEA - Nordjyllands Erhvervsakademi 7

Nedarvning - Constructors

• Basisdelen af en nedarvet klasse initialiseres ved kald til base(param-liste).

• Kald til forfaders constructor er det første der sker i den nedarvede klasses constructor.

• :base(param-liste) placeres umiddelbart efter constructorens metodehoved – notation taget fra C++

• Hvis man ikke definerer en constructor, genereres en default. Ved nedarvning kalder denne implicit en default constructor (parameterløs) på basisklassen.

Page 8: Objektorienteret programmering

FEN 2008-09-03 NOEA - Nordjyllands Erhvervsakademi 8

Nedarvning - redefinering

• En basisklasse-metode kan redefineres i den nedarvede klasse• Fx Haev-metoden på en Konto/CheckKonto• En basisklasse-metode der skal redefineres i den nedarvede

klasse, skal erklæres virtual i basisklassen, og eksplicit overrides i den nedarvede klasse.

• En override-metode tilsidesætter basisklassens metode.• Metoden i den nedarvede klasse skal have samme signatur og

returtype som den virtuelle den redefinerer.• En redefineret metode kan kalde den metode den redefinerer i

superklassens vha. base.metodenavn();

Page 9: Objektorienteret programmering

FEN 2008-09-03 NOEA - Nordjyllands Erhvervsakademi 9

Nedarvning - polymorfi

• Alle referencevariabler i C# kan referere objekter af nedarvede typer – (polymorf = mange former).

• Ved virtuelle metoder træffes der beslutning på run-time om hvilken metode der skal kaldes.

• Metoden der kaldes er den der er defineret på det objekt referencen i øjeblikket refererer.

• Dette kaldes dynamisk binding.

Page 10: Objektorienteret programmering

FEN 2008-09-03 NOEA - Nordjyllands Erhvervsakademi 10

Polymorfi/Dynamisk binding

Som vi plejer at se det: Ansat programmør = new Ansat("KodeKarl","Programmør",22222);

Statisk type = Dynamisk type

Statisk metodekald

Statisk type Dynamisk type

Med polymorft typesystem: Ansat chef = new Chef(”Bosse",”Direktør",52525, 500);

Dynamisk type er samme som eller arving til statisk type

Compiler checker på statisk type om metode eksisterer, kald til metode vha. dynamisk binding

Dynamisk binding forudsætter at metoder er erklæret virtual

Dynamisk type

Statisk type

Page 11: Objektorienteret programmering

FEN 2008-09-03 NOEA - Nordjyllands Erhvervsakademi 11

Polymorfi – brug af ArrayList

• Den statiske type checkes af compileren – derfor cast• Den dynamiske type bestemmes run-time• Den dynamiske type skal være lig den statiske eller en subtype (dvs.

nedarvet fra) til den statiske• Ved et metodekald startes (ved dynamisk binding) med at kigge efter

metoden i den dynamiske type• Derefter ledes efter metoden opad gennem arvehierarkiet

for(int i= 0;i<ansatte.Count;i++)

((Ansat)ansatte[i]).GivBonus(10000);

foreach(Ansat ans in ansatte)

ans.GivBonus(10000);

Eksplicit cast Implicit cast

• ArrayList indeholder elementer af den statiske type Object

Page 12: Objektorienteret programmering

FEN 2008-09-03 NOEA - Nordjyllands Erhvervsakademi 12

Eksempel

• Lad os implementere domænemodellen fra før:

Projekt

navnafdeling

ArbejderPaa

timer10..* 10..*

Ansat

navnstillingløn 1 0..*1 0..*

Chef

antalOptioner

Sælger

antalSolgteEksemplarer

Page 13: Objektorienteret programmering

FEN 2008-09-03 NOEA - Nordjyllands Erhvervsakademi 13

Øvelse

• Lav opgave 1 og 2 i KontoOpgave.htm

Page 14: Objektorienteret programmering

FEN 2008-09-03 NOEA - Nordjyllands Erhvervsakademi 14

Substitutionsprincippet

• Den dynamiske type skal altid kunne bruges i stedet for den statiske

• Dvs., at objekter af en nedarvet type skal kunne anvendes i stedet for objekter af den oprindelige

• De skal kunne substitueres

• Dette sikres ved at vi ved redefinering af methoder kun afsvækker pre-betingelser og strammer post-betingelser.

Page 15: Objektorienteret programmering

FEN 2008-09-03 NOEA - Nordjyllands Erhvervsakademi 15

Eksempel:

public class Shape{

private int x,y; // figurens position

private Colour color; //figurens farve

//øvrige attributter

public virtual void MoveTo(int newX, int newY){

//PRE 0 <= newX <= maxX && 0 <= newY <= maxY,

// hvor maxX og maxY angiver vinduets maksimum

// POST x'=newX && y'=newY

}

public virtual float Area(){

//PRE none

//POST returnerer figurens areal med 4 decimalers nøjagtighed

// beregnet efter en eller anden tilnærmet metode

}

}//end Shape

public class Circle: Shape{

private int r; //radius - x, y

//og color arves

public override float Area(){

}

public override void MoveTo(){

}

}//end circle

Hvad må vi gøre med Area()?

Hvad må vi gøre med MoveTo()?

Page 16: Objektorienteret programmering

FEN 2008-09-03 NOEA - Nordjyllands Erhvervsakademi 16

Nedarvning- designovervejelser

• Lad os antage at vi skal bruge en klasse der kan indeholde en liste af ansatte, hvor det er muligt at tilføje sidst i listen, men ikke midt i – Skal vi arve fra Array, ArrayList eller?

• Nej vi skal ikke arve, men bruge delegation

• Arv bør ikke bruges blindt for at opnå kodegenbrug - arv er typespecialisering!

• Arv skal kunne forsvares logisk som en ”A er-en B”• Kodegenbrug kan i stedet opnås ved at bygge oven

på eksisterende klasser. Kaldes også for komposition, delegering, mm.

Page 17: Objektorienteret programmering

FEN 2008-09-03 NOEA - Nordjyllands Erhvervsakademi 17

Nedarvning - abstract

• En klasse som indeholder en eller flere metoder som ikke er defineret kaldes abstrakt

• En abstrakt klasse bruges kun i forbindelse med arv, og kan ikke instantieres, dvs. der kan ikke oprettes objekter af en abstrakt klasse.

• En abstrakt metode skal redefineres i de(n) nedarvede klasse(r).

• En abstrakt metode definerer funktionalitet for alle arvinger (men implementerer ikke).

• En constructor i en abstrakt klasse bruges kun af arvingernes constructors

Page 18: Objektorienteret programmering

FEN 2008-09-03 NOEA - Nordjyllands Erhvervsakademi 18

Designeksempel: Composite-pattern

1

Circle Rectangle Picture

Shape

0..*0..*

Position

1

Composite: Grafisk editor, Tekstbehandling, Køkkenlager mmm.

Hvordan ser en Show-metode ud på Shape, Circle og Picture

Page 19: Objektorienteret programmering

FEN 2008-09-03 NOEA - Nordjyllands Erhvervsakademi 19

Typekompatibilitet, polymorfi og dynamisk binding

• Et eksempel (Antag at vi har et klassehieraki med en Konto og CheckKonto som arver fra Konto):

Konto konto = new Konto(); CheckKonto ckonto = new CheckKonto();konto = ckonto;

// OK, idet ckonto er typekompatibel, på konto-referencen// kan dog kun tilgå medlemmer fra Konto-klassen.

• Når eksempelvis metoden konto.tilskrivRente() kaldes, vil det være checkkontoens metode der bliver kaldt – i fald den er erklæret som override og erklæret virtual i basisklassen. (Objektet retter sig efter objektets type – den dynamiske type - i stedet for referencens – den statiske type: polymorfi og dynamisk binding)

Page 20: Objektorienteret programmering

FEN 2008-09-03 NOEA - Nordjyllands Erhvervsakademi 20

C#- Hvornår er objekter ens?

• Klasser bør override Equals-metodenpublic class Customer{ . . .

public override bool Equals(object obj) { Customer other; if ((obj == null) || (!(obj is Customer))) return false; // helt sikkert ikke ens

other = (Customer) obj; // typecast for adgang return this.id == other.id; // ens hvis ens id... }

Page 21: Objektorienteret programmering

FEN 2008-09-03 NOEA - Nordjyllands Erhvervsakademi 21

Opgaver

• Løs resten af KontoOpgaven