270 likes | 557 Views
Arv. Generalisering/Specialisering: Arv. Klasser kan organiseras i hierarkier. En subklass ”ärver” samtliga egenskaper (attribut och operationer) från sin superklass Abstrakta superklasser används enbart för att kunna skapa subklasser med gemensamma egenskaper G/S med polymorfism
E N D
Generalisering/Specialisering: Arv • Klasser kan organiseras i hierarkier. • En subklass ”ärver” samtliga egenskaper (attribut och operationer) från sin superklass • Abstrakta superklasser används enbart för att kunna skapa subklasser med gemensamma egenskaper • G/S med polymorfism • En subklass kan ”överskugga” metoden för en ärvd operation, dvs ha en egen metod (kod) för samma operation (tjänst)
Klasshierarkier Generella klasser utskriftsenhet däggdjur moderklasser katt hund marsvin plotter skrivare tax golden schäfer matris laser bläck Applikationsspecifika klasser
Arv Objekt kan uppvisa likheter med varandra även om de inte tillhör samma klass Då innehåller dessa klasser delvis identiska beskrivningar
Arv Fordon Bil Lastbil Flygplan Tåg class Fordon {} class Bil extends Fordon {} class Lastbil extends Fordon {} class Tåg extends Fordon {} class Flygplan extends Fordon {}
Arv Person födelsedag : DateTime namn : string telefon : string Person(födelsedag : DateTime, namn : string, telefon : string) Telefon() : string Telefon(value : string) Namn () : string Födelsedag () : DateTime DagarTillNästaFödelsedag () : int Student inskrivningsår : int betaldKåravgift : bool Student(födelsedag : DateTime, namn : string, telefon : string, år : int, betalt : bool) Inskrivningsår() : int Inskrivningsår(value : int) betaldKåravgift() : bool betaldKåravgift(betalt : bool)
Specialisering - generalisering Person Superklass Subklass Student Lärare Kan läsas som ”är ett slags” ( ”is a” )
Klassbibliotek C#: using Klassbibliotek Applikationsspecifika utvidgningar
superklass Varje klass K i C# (utom klassen Object) är en utvidgning av åtminstone en bestämd klass, som kallas den omedelbara superklassen till K. Att en klass är en omedelbar utvidgning av en annan klass anges med kolon : Anger vi inget arv ärver vi i C# ändå alltid från klassen Object.
Enkelt arv En klass har vid enkelt arv högst en omedelbar superklass En klass får ha godtyckligt antal subklasser superklass subklass subklass subklass
Enkelt arv • Subklassen har alla egenskaper som superklassen har och eventuellt fler • Arv av alla attribut, operationer och associationer Cykel märke modell beräknaLivslängdKvar() Växelcykel
Arv med tillägg (utvidgning) Cykel märke modell beräknaLivslängdKvar() • Man kan lägga till attribut och/eller operationer Växelcykel antalväxlar beräknaDrevlivslängd() nytt attribut ny operation
Abstrakta klasser Konto saldo : double Saldo () : double LöneKonto SparKonto kredit : double LoneKonto(saldo : double, kredit : double) Kredit() : double
Om varje instans ur klassen T skall vara en instans ur en subklass, så är klassen T en abstraktklass En klass som saknar objekt Fångar det som är gemensamt i flera klasser Gemensamma attribut, operationer och relationer Deklaration av metoder (tala om att de finns men de är ej implementerade) Abstrakta klasser Konto saldo: Money Kursiv stil = abstrakt klass LöneKonto SparKonto
Interface «interface» ISkrivbart «interface» ILäsbart Endast operationer, interface kan inte ha några metoder Måste implementera egna metoder för interfacets operationer Ett interface kan liknas vid en abstrakt klass, med enbart abstrakta operationer, dvs utan metoder Skriv () Läs () Dokument Skriv () Läs ()
Exempel: interface interface ISkrivbart { public void Skriv(); } interface ILäsbart { public void Läs(); } class Dokument : ISkrivbart, ILäsbart { public void Skriv() { // Kod för att skriva } public void Läs() { // Kod för att läsa } } I C# finns interface. I C++ används istället abstrakta klasser med ”virtuella” metoder!
Interface • Interface och objekt • Alla objekt som implementerar ett ”interface” är också instanser av detta interface. • Instanser av ett interface kan inte skapas som sådana, utan kan endast skapas som instanser av en klass som implementerat interfacet ... IList c = new ArrayList(); ... «interface» IList För att förenkla förståelsen av ”interface” kan vi tänka på dem som ”abstrakta klasser”, där vi endast angett vilka metoder som skall finnas, men utan att ange någon implementation för dessa metoder. ArrayList
Interface • Generalisering/specialisering • Även interface kan organiseras i hierarkier. • Ett subinterface ärver samtliga operationer från sitt superinterface «interface» ICollection interface IList : ICollection { ... } «interface» IList «interface» IDictionary SortedList ArrayList
this, base vid anrop av konstruktor I en konstruktor kan vi anropa en annan konstruktor för samma klass (this), eller en konstruktor för den omedelbara överklassen (base) i en s.k. “initieringslista”. class B : A { int b; int c; public B (int x, int y, int z) : base(x) { b = y; c = z; } public B (int x, int y) : this(x, y, 0) {} } class A { int a; public A (int x) { a = x; } }
base vid anrop av överklassens metoder Andra metoder i överklassen än konstruktorn kan vi anropa var som helst inom en metod. För att nå överskuggade metoder i överklassen använder vi base. class A { int a; public int f () { return a; } } class B : A { int b; public int f () { int x = base.f(); return x + b; } } I många OO-språk används istället för base nyckelordet super
Fördelar Speglar verkligheten bättre Minimal redundans Flexibelt Nackdelar Kan öka komplexiteten Namnkonflikter Stöds ej av alla programspråk(exempelvis inte av C# eller Java) Multipelt arv Radio Klocka frekvens : int frekvens : int KlockRadio Vilken frekvens ärvs?
Exempel: multipelt arv class Klocka { int frekvens } class Radio { int frekvens } OBS! Exemplet är från C++, går inte i C# class KlockRadio : Klocka, Radio { } Hur detta i verkligheten fungerar är kompilatorberoende! I C# är multipelt arv inte tillåtet!
En vanlig lösning i C#: komposition class Klocka { int frekvens } class KlockRadio { private Klocka k = new Klocka(); private Radio r = new Radio(); public int KlockFrekvens { get { return k.frekvens; } set { k.frekvens = value; } } public int RadioFrekvens { get { return r.frekvens; } set { r.frekvens = value; } } } class Radio { int frekvens }
Person Ägare Kanslist ÄgarPerson KanslistPerson ÄgarKanslistPerson Ett exempel till: Multipelt arv
Person Ägare Kanslist Roll Exempel: Anpassa till enkelt arv 1 1..2 • Använd en abstrakt rollklass och en association
Exempel: enkelt arv class Roll { } class Aegare : Roll { } class Kanslist : Roll { } class Person { Roll[] roller = new Roll[2]; roller[0] = new Aegare(); roller[1] = new Kanslist(); }