200 likes | 432 Views
07 – Kort om OO. Introduktion. Kort om begreber i objekt orienteret programmering. Klasser og objekter Arv og polymorfi. Objekt. Et objekt har en tilstand og en adfærd: Objektets tilstand er de attributter der kendetegner objektet
E N D
07 – Kort om OO Introduktion
Kort om begreber i objekt orienteret programmering • Klasser og objekter • Arv og polymorfi
Objekt • Et objekt har en tilstand og en adfærd: • Objektets tilstand er de attributter der kendetegner objektet • Adfærd bevirker at man kan ændre eller aflæse et objekts tilstand
Klasse • Klassen er den fælles beskrivelse for objekterne. • Objekterne er de konkrete forekomster af klassen • Klasser eksisterer hele tiden - objekter kommer og går
Metodeoverloading • Flere metoder med samme navn kan erklæres i samme scope, blot de har forskellige parameterlister. • Fx: public Bankkonto(int kontonr){ kontonummer = kontonr; saldo = 0; } public Bankkonto(int kontonr; double saldo){ kontonummer = kontonr; this.saldo = saldo; }
Access Modifiers • Public • Kan tilgås af alle metoder fra alle objekter • Private • Kan tilgås af den definerende klasses medlemmer og ikke andre • Protected • Kan tilgås af klassen selv og af arvinger – privat for alle andre • Internal • Kan tilgås af den definerende klasse og alle klasser i samme assembly • Protected internal • Kan tilgås af den definerende klasse, klasser i samme assembly og fra arvinger
Tilgå private attributter • Vi ønsker at holde attributter private dels for at kunne skjule implementation (ikke fordi den hemmelig, men det giver frihed til at kunne ændre implementation) • Men også for evt. at kunne styre hvordan de tilgås, således at objektet stadig har en vaild tilstand.Et banalt eksempel at saldo ikke bliver sat til et negativt tal, hvis der ikke må være overtræk på kontoen • Tilgangen styres vha. get og set metoder. • get-metoder kaldes også accesors, fordi de aflæser en værdi • set-metoder kaldes mutators fordi de ændrer en værdi • Aht. JavaBeans bør følgende konvention tilstræbes: • public <datatype> getAttributNavn() //hvis read mulig • public voidsetAttributNavn(<datatype> d) //hvis write mulig
Eksempel på realisering af domænemodel • Del af design-klassediagram i et system til registrering af ansatte og projekter
Realisering af objektforbindelse • Designovervejelser • Hvilken vej skal objekterne kunne tilgås • Forbindelse til 1 objekt • Simpel objektreference • Forbindelse til * objekter • Reference til collection på 1-siden
OO = Programkvalitet Mål: • modificérbarhed • pålidelighed • effektivitet Midler: • indkapsling og dataabstraktion • nedarvning og polymorfi • CLR
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
OO-Principper-nedarvning • 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
OO-Principper-nedarvning • Nedarvning understøtter kodegenbrug • 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: CheckKontock = new CheckKonto(); If (ck is Konto) returnerer true hvis CheckKonto arver fra Konto • Er-en forholdet er transitivt.
Nedarvning - Constructors • Hvis man ikke definerer en constructor, genereres en default. Ved nedarvning kalder denne implicit en default constructor (parameterløs) på basisklassen. • 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 constructorensmetodehoved
public class Ansat{ protected string navn; protected float løn; public Ansat(){} public Ansat(string navn, float løn){ this.navn = navn; this.løn = løn; } …………… } public class Chef : Ansat{ private ulong antalOptioner; public Chef(){} public Chef(string navn, float løn, ulong numbOfOpts) : base(navn, løn) { antalOptioner = numbOfOpts; } ……….. } Nedarvning- attributter og constructors
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. • Dette 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 superklassen vhabase.metodenavn();
public class Ansat{ …………….. public voidGivBonus(floatbelob){ løn += belob; } ……………… } public class Chef : Ansat{ ……………. public @OverridevoidGivBonus(floatbelob){ base.GivBonus(belob); antalOptioner += 500; } …………………. } Nedarvning- redefinering
Polymorfi- redefinering af metoder • Først implementerer vi metoden GivBonus(int belob) som virtual i klassen Ansat • Herefter redefiner vi den i klasserne Chef og Saelger • Endelig oprettes et array af Ansatte i main, hvor alle medarbejdere får 500,- i bonus
Abstrakte klasser • Lad os antage at man i sine designovervejelser har vedtaget at klassen Ansat er for generel. Man ønsker ikke at kunne oprette objekter af den, ligesom en generel GivBonus-metode ikke realiseres. • Vi gør nu Ansat-klassen abstrakt (GivBonus-metoden gøres abstrakt)