Objektorienterad programmering Grundläggande begrepp
Hur beskriver vi objekt? Vill ha en representationsoberoende beskrivning Abstrakta datatyper! Data Operationer
Objekt Representerar en verklig eller abstrakt sak/enhet med en väldefinierad roll i problemdomänen Ett objekt har tillstånd, beteende och unik identitet Allt är objekt (dvs alla datastrukturer representeras som objekt)
Exempel 1 - objekt Tillstånd: Grön, Ford, 4 hjul, parkerad Beteende: Starta, stanna, accelerera, Bromsa, svänga höger, svänga vänster Samma tillstånd, samma beteende men ett annat objekt
Objekt, forts. Attribut objektets egenskaper, tillstånd Kallas ibland instansvariabler Metoder objektets beteende Funktioner/procedurer med tillgång till objektets attribut Kan ändra objektets tillstånd
Exempel 2 - objekt b1:bok name = Muminpappans memoarer utgavs = 1968 författare = p1:person förnamn = Tove efternamn = Jansson
Exempel 3 - objekt b1:bok namn = Muminpappans memoarer utgavs = 1968 författare = b2:bok namn = Trollkarlens hatt utgavs = 1948 författare = p1:person förnamn = Tove efternamn = Jansson
Notation Antag att variabeln b1 refererar till ett Book-objekt, då är b1.namn objektets namn-attribut b1.författare.förnamn???
Inkapsling Objektets tillstånd är inte tillgängligt utifrån. Endast en del av objektets attribut och metoder syns utåt - objektets gränssnitt. Gränssnittet är en abstraktion av objektet. Tillståndsövergångar triggas genom att objektets gränssnittsmetoder körs. Skyddar objektet mot fel i andra objekt.
Exempel 4 - inkapsling Färg: grön Hastighet: 0 gasa bromsa Ändra hastighet
Inkapsling i olika språk Smalltalk Attribut är lokala men metoder kan exporteras Eiffel Attribut och metoder kan exporteras, ingen skillnad syntaktiskt Java Synlighet deklareras för attribut och metoder Hur gör man för att läsa/ändra värdet på ett attribut Smalltalk?
Objektorienterad design är en konstruktion av mjukvarusystem som strukturerade samlingar av implementationer av abstrakta datatyper.
Kommunikation Objekt skickar meddelanden till varandra Ett meddelande är en begäran om en handling som ska utföras När ett objekt får ett meddelande körs motsvarande metod
Exempel 5 - meddelanden Färg: grön Hastighet: 0 gasa! me:person name = Aletta age = 17
Objektorienterade program Ett OO program är en värld befolkad av objekt som kommunicerar med varandra
Klasser En klass är en mall för objekt Klassen definierar vilka attribut och metoder objekten ska ha Ett objekt är en instans av en klass Objekt som är instanser av samma klass har samma beteende Klassen är objektets typ Alla objekt av en viss klass kan användas på samma sätt de har samma gränssnitt.
Exempel 6 Klass & objekt name age Person get_older me:person name = Aletta age = 17 someguy:person name = Bertil age = 56 myfriend:person name = Cecilia age = 32
Tänk på Objekt är run-time element som skapas under körning Klasser är statiska beskrivningar av möjliga objekt instanser av klassen Vid run-time finns bara objekt I programmet finns endast klasser
Detta är INTE OO Att stoppa in all information i ett objekt Att använda objekt som struktar i C Objekt med otydligt ansvar Vagt definierade gränssnitt
Tänk på Ett programmeringsspråk kan ge stöd för programmering enligt en viss paradigm men ett program blir inte objektorienterat bara för att det är skrivet i Java. objektorienterade program kan skrivas i vilket språk som helst.
Arv Mål: Återanvändning Definiera gemensamma egenskaper i en klass Inkludera dessa egenskaper i nya klasser Lägg till specifika egenskaper till de nya klasserna Fördelar: Mindre kod Lätt att underhålla
Exempel: Arv, forts. lön Anställd Programmerare projekt Person namn ålder adress getname() poäng Student
Hur relateras klasser genom arv? Arv betyder att en klass ärver implementation av en annan Arv definierar en transitiv är en hierarki Klasserna bör vara konceptuellt relaterade
När klass A ärver av klass B A ärver alla attribut och metoder som finns i B A är en subklass till B B är en superklass eller föräldraklass till A
Effekter av arv Alla subklasser till en gemensam superklass har samma grundegenskaper, alltså har de gemensamt gränssnitt
Polymorfism Många skepnader Ett gränssnitt kan ha flera olika implementationer Ett namn kan beteckna olika saker, olika typer av objekt Ex. aperson.getname() fungerar oavsett om aperson är ett Person-, Anställd-, Studenteller Programmerare-objekt.
Hittills Strikt arv endast utvidgning av klasser Lätt att hantera Oflexibelt Förhindrar återanvändning Lösning: Tillåt att ärvda egenskaper ändras / omdefinieras Bag insert( ) delete( ) empty( ) size( )??? Set
Icke-strikt arv Bag Ärvda egenskaper kan omdefinieras Mer flexibilitet Förenklar återanvändning insert( ) delete( ) empty( ) size( ) Set redefine insert
Statisk bindning Omdefinitioner gäller före ärvda egenskaper Samma anrop har alltså olika effekt
Dynamisk bindning Det kan finnas flera olika metoder att välja mellan, beroende på objektets typ.
Rekommendation Använd arv endast när det är lämpligt att ärva implementation, och subklassen representerar en delmängd av superklassen Ofta är det lämpligt att introducera en ny klass som rymmer gemensamma datastrukturer och metoder.
Multipelt arv En klass kan ärva från flera superklasser Problem?
Arv i några olika språk Java Tillåter inte multipelt arv annat än i en begränsad form en klass kan implementera fler interface C++, Eiffel Tillåter multipelt arv