DD2385 Programutvecklingsteknik Några bilder till föreläsning 4 31/3 2017 Innehåll Abstrakta klasser Klasshierarki och typhierarki Polymorfism och dynamisk bindning Polymorfi-exempel: Schack Klassen Object i Java Demonstration av equals() från Object UML-översikt Inleds med Abstrakt klass abstract class Kombination av vanlig klass och interface Kan innehålla vanliga metoder och variabler Innehåller oftast minst en abstrakt metod som definieras i subklass Objekt av klassen kan inte skapas Exempel: Implementation av Schackpjäser De olika pjäserna har mycket gemensamt Men förflyttning sker på olika sätt Definiera en abstrakt klass med allt gemensamt Definiera en konkret subklass för varje pjästyp: Bonde Springare Löpare Torn Dam Kung
Exempel: Skiss av klasser abstract c l a s s S c h a c k p j a s { C o l o r f a r g ; Image b i l d ; Brade brade ; Ruta r u t a ; S c h a c k p j a s (... ) {... // k o n s t r u k t o r abstract boolean dragok ( Ruta r1, Ruta r2 ) ; dragok() ger true om flytt från ruta r1 till ruta r2 är ett tillåtet drag för aktuell pjäs, false annars. c l a s s Bonde extends S c h a c k p j a s { // implementera bondens drag Konstruktor m.m. visas ej. Exempel: Skiss av klasser c l a s s Dam extends S c h a c k p j a s { // implementera damens drag c l a s s Torn extends S c h a c k p j a s { // implementera t o r n e t s drag c l a s s S p r i n g a r e extends S c h a c k p j a s { // implementera s p r i n g a r e n s drag Klasshierarki = Typhierarki Klasshierarkin är en trädstruktur Referenser av viss typ får referera till objekt av typer som är nedanför i trädet. Schackpjas får referera till Bonde, Dam, Kung, Torn... En Schackpjas har många former (Bonde, Dam... ): POLYMORFISM Dynamisk bindning En Schackpjas-referens ser endast Schackpjas-definitioner, t.ex. dragok() Om en metod, t.ex. dragok(), definierats om i en subklass, så används den omdefinierade metoden. Objektetets typ och inte referensens typ väljer metod. Detta är dynamisk bindning S c h a c k p j a s p j a s = new... //Dam, Kung, Torn...... p j a s. dragok (.. ) // Dynamiskt metodval // beroende av typen // hos pjas o b j e k t e t
Klass/typ - hierarki för Schackpjäserna med UML-notislappar Klass/typ - hierarki för Schackpjäserna Schackpjas - ruta : Ruta - farg : string + dragok(r1 : Ruta, r2 : Ruta) Kung Lopare Springare Dam Torn Bonde dragok() är en abstrakt metod. dragok() implementeras olika i Kung, Dam, Lopare... Alla klasserna har fler metoder i en riktig tillämpning Klassen Object Superklass till alla Javaklasser Överst i klasshierarkin Mest generella typen i Java Object - referens kan referera till alla objekt Innehåller 11 metoder Alla klasser har 11 metoder från Object Flera metoder ärvs tomma eller väldigt enkla, kan/bör definieras om av subklasserna. Metoderna i Object String tostring() String-repr. boolean equals(object o) likhet? int hashcode() Object clone() kopia void finalize() anropas före GC Class getclass() meta-information void notify() väck en tråd void notifyall() väck alla trådar void wait() lägg tråd void wait(t) i void wait(t,n) vänteläge
Jämförelse med == eller equals()? == jämför variablers innehåll primitiva typer: enkelt och självklart om k är 5 så får k==5 värdet true referenstyper: samma princip equals() kan jämföra objekts innehåll om man definierat om den Spelkort s1 = new Spelkort("RUTER",5); Spelkort s2 = new Spelkort("RUTER",5); Spelkort s3 = s2; s1 == s2 false inte samma referens (men likadana objekt) s2 == s3 true samma referens s1.equals(s2) kan ge true om man definierat equals() rätt i Spelkort Exempel: Program som testar equals i Spelkort c l a s s EqualsDemo { p u b l i c s t a t i c void main ( S t r i n g [ ] u ) { S p e l k o r t k o r t 1 = new S p e l k o r t ( Spader, 1 1 ) ; S p e l k o r t k o r t 2 = new S p e l k o r t ( Spader, 1 1 ) ; System. out. p r i n t l n ( Kort1 : + k o r t 1 ) ; System. out. p r i n t l n ( Kort2 : + k o r t 2 ) ; System. out. p r i n t l n ( ) ; S... ( Korten l i k a? + k o r t 1. e q u a l s ( k o r t 2 ) ) ; S... ( Kort l i k a med 17? + k o r t 1. e q u a l s ( 1 7 ) ) ; System. out. p r i n t l n ( ) ; Med gamla Spelkort blir utskriften från EqualsDemo Kort1: Spader KNEKT Kort2: Spader KNEKT Korten lika? false grunddefinitionen av equals() Kort lika med 17? false Lägg till equals() i Spelkort Inget annat ändras c l a s s S p e l k o r t { : p u b l i c boolean e q u a l s ( Object annat ){ i f (! ( annat i n s t a n c eof S p e l k o r t ) ) return f a l s e ; S p e l k o r t a n n a t k o r t = ( S p e l k o r t ) annat ; : return a n n a t k o r t. v a l o r==t h i s. v a l o r && a n n a t k o r t. f a r g. e q u a l s ( t h i s. f a r g ) ; Med nya Spelkort blir utskriften från EqualsDemo Kort1: Spader KNEKT Kort2: Spader KNEKT Korten lika? true NY definition av equals() Kort lika med 17? false
UML vanlig klass UML-ÖVERSIKT Konto + namn : String - personnummer : int ~ saldo : double + antalkonton : int = 0 + sättin() + taut() - idkontroll() # beräknaränta() Variabler, ev. med typ Metoder, ev. typ, ev. parameterlista ~ paketsynlighet # protected + public - private understruket betyder static Java-specifik UML UML arv och implementation UML - associationer Superklass «interface» Interface A C ass_name B D Oriktad eller dubbelriktad association Riktad association, har, känner till E 1..* F Aggregat, har, består av, äger ej Subklass ImplementerandeKlass G 1 5 H Komposition har, består av, äger Relationen ÄR M N Beroende beror av, metodparameter, lokal variabel
UML - dubbelriktad association UML - exempel Course ~ courseid : int - name : string - t : Teacher + enroll(stud : Student) 1..4 1..* 1 taught_by 1..2 «interface» Teacher + givetest(t : Test) A A:s roll i B B:s roll i A B enrolled waiting Student - studentid : int + taketest(t : Test) Professor UnderGrad Grad Test Grade