TDDD78 Objektorientering i Java, del 2

Relevanta dokument
TDDD78 Objektorientering i Java, del 2

Typhierarkier del 1 Gränssnitt, ärvning mellan gränssnitt, ärvning mellan klasser

Motivation. Programmeringsuppgift: En första ansats: Lagra info om anställda Håll reda på varje anställds närmaste chef. som också är en anställd!

TDDD78, TDDE30, 729A Typhierarkier del 2 Vad krävs? Hur fungerar det?

TDDD78 Viktiga begrepp, del 2

TDDD78 Viktiga begrepp i programmering / objektorientering

Sammansatta datatyper Generics: Parametrisk polymorfism

Ärvning av implementation. Ärvning av implementation, inklusive abstrakta klasser Hur ska vi ärva? När ska vi ärva?

TDDD78 Objektorientering i Java, del 4. Hur vet man om två objekt är lika? Hur undviker man objekt och när?

Objektorienterad Programmering (TDDC77)

Abstrakt datatyp. -Algoritmer och Datastrukturer- För utveckling av verksamhet, produkter och livskvalitet.

Outline. Objektorienterad Programmering (TDDC77) Signatur. Klassen calculator. Överlagring (overloading) Arv (inheritance) Ahmed Rezine

Classes och Interfaces, Objects och References, Initialization

Ett problem. Kontrollstrukturer och arrayer. Arrayer. Lösningen. Arrayer och hakparanteser. Exempel int[] results; results = new int[10]; // 0..

Repetition av OOP- och Javabegrepp

Repetition av OOP- och Javabegrepp

UML. Översikt UML. Relationer mellan klasser. A är ett aggregerat av B:n. Kontor aggregat av Enheter. 12 olika diagramtyper, bl.a.

TDDD78 Objektorientering i Java, del 3

Static vs Dynamic binding Polymorfism. Objekt-orienterad programmering och design (DIT953) Niklas Broberg, 2018

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

TDDD78 Introduktion till OOP i Java

Exempel. Arrayer. Lösningen. Ett problem. Arrayer och hakparanteser. Arrayer

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

TDDD78, TDDE30, 729A Typhierarkier del 3 När och hur vill vi använda dem? Några Best Practices

Arv: Fordonsexempel. Arv. Arv: fordonsexempel (forts) Arv: Ett exempel. En klassdefinition class A extends B {... }

Introduktion till objektorientering. Vad är objektorientering egentligen? Hur relaterar det till datatyper? Hur relaterar det till verkligheten?

Inkapsling tumregler. Åtkomstmodifikatorer, instantiering, referenser, identitet och ekvivalens, samt klassvariabler. public och private

Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser

Tommy Färnqvist, IDA, Linköpings universitet

Classes och Interfaces, Objects och References Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Föreläsning 5-6 Innehåll

Subklasser och arv Inledning till grafik (JFrame och JPanel). Något om interface. Objektorienterad programvaruutveckling GU (DIT011) Subklasser

Arrayer. results

TDDD78 Introduktion till OOP i Java

Introduktion till objektorientering. Vad är objektorientering egentligen? Hur relaterar det till datatyper? Hur relaterar det till verkligheten?

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

Static vs Dynamic binding Polymorfism. Objekt-orienterad programmering och design Alex Gerdes, 2016

2I1049 Föreläsning 5. Objektorientering. Objektorientering. Klasserna ordnas i en hierarki som motsvarar deras inbördes ordning

public och private Obs: private inte skyddar mot access från andra objekt i samma klass.

Listor. Koffman & Wolfgang kapitel 2, avsnitt , och 2.9

DAT043 - föreläsning 8

Idag. statiska metoder och variabler. private/public/protected. final, abstrakta klasser, gränssnitt, delegering. wrapper classes

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 2

Föreläsning 13 Innehåll

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

TDDD78 Introduktion till OOP i Java

Introduktion till objektorientering. Vad är objektorientering egentligen? Hur relaterar det till datatyper? Hur relaterar det till verkligheten?

Länkade strukturer. (del 2)

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

Introduktion till objektorientering. Vad är objektorientering egentligen? Hur relaterar det till datatyper? Hur relaterar det till verkligheten?

Subtyping och variance. Objekt-orienterad programmering och design Alex Gerdes, 2018

Variabler, värden och typer

TDDD78 Objektorientering i Java, del 3. Ärvning av implementation, inklusive abstrakta klasser Hur ska vi ärva? När ska vi ärva?

Objektorientering: Lagring och livstid

Objektorienterad Programmering (TDDC77)

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-17, TDA540. Dag: , Tid:

Samlingar Collection classes

Arv. Fundamental objekt-orienterad teknik. arv i Java modifieraren protected Lägga till och modifiera metoder med hjälp av arv Klass hierarkier

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

F9 - Polymorfism. ID1004 Objektorienterad programmering Fredrik Kilander

DAT043 - Föreläsning 7

Föreläsning 8. Arv. Arv (forts) Arv och abstrakta klasser

Vad handlar kursen om? Algoritmer och datastrukturer. Vad handlar kursen om? Vad handlar kursen om?

Interface. Interface. Tobias Wrigstad (baserat på bilder från Tom Smedsaas) 3 december 2010

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Erik Nilsson, Institutionen för Datavetenskap, LiU

Exempel på listor (klassen ArrayList). Ett exempel med fält. Avbildning är en speciell typ av lista HashMap.

Outline. Objektorienterad Programmering (TDDC77) Att instansiera en klass. Objekt. Instansiering. Åtkomst. Abstrakt datatyp.

Objektorientering: Lagring, räckvidd och livstid

Sammansatta datatyper Generics: Parametrisk polymorfism

Föreläsning 12. Länkade listor

Föreläsning 8: Exempel och problemlösning

Föreläsning 4 Innehåll. Abstrakta datatypen lista. Implementering av listor. Abstrakt datatypen lista. Abstrakt datatyp

UML. Klassdiagr. Abstraktion. Relationer. Överskugg. Överlagr. Aktivitetsdiagram Typomv. Typomv. Klassdiagr. Abstraktion. Relationer.

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

Variabler, värden och typer

Föreläsning 2. Länkad lista och iterator

Föreläsning 4. Klass. Klassdeklaration. Klasser Och Objekt

Föreläsning 2, vecka 8: Repetition

DAT043 Objektorienterad programmering för D, DIT011 Objektorienterad programvaruutveckling för GU

Outline. Objektorienterad Programmering (TDDC77) Åsidosättning. Signatur. Åsidosättning. Abstrakta klasser. Ahmed Rezine.

Objektorienterad Programmering (TDDC77)

TDDD78 Objektorientering: Lagring och livstid

Klasshierarkier - repetition

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

Konstruktion av klasser med klasser

Lösningsförslag till omtentamen för TDA540 Objektorienterad Programmering

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Subtyping, co- och contra-variance. Objekt-orienterad programmering och design Alex Gerdes, 2016

Objektorienterad programmering. Fält som funktionsresultat. Mer om fält: att uppdatera ett parameterfält. Kontrast: Parametrar av primitiv typ

Föreläsning REPETITION & EXTENTA

ITK:P1 Föreläsning 1. Programmering. Programmeringsspråket Java. Stark typning Explicit typning Strukturerat Hög säkerhet

Tentamen OOP

Föreläsning 5 (6) Metoder. Metoder Deklarera. Metoder. Parametrar Returvärden Överlagring Konstruktorer Statiska metoder tostring() metoden javadoc

TDDE10 TDDE11, 725G90. Objektorienterad programmering i Java, Föreläsning 3 Erik Nilsson, Institutionen för Datavetenskap, LiU

Innehåll. dynamisk bindning. och programmering CRC) u Arv, polymorfi och

Begreppet subtyp/supertyp i Java. Mera om generik. Generik och arv. Generik och arv. Innehåll

EDAA20 Föreläsning Klassen ArrayList. Viktiga operationer på ArrayList. Generisk klass

public interface Skrivbar { void skriv(); } public class Punkt implements Skrivbar { public double x; public double y;

2203$( Föreläsning ii - Mer om Java bla this och konstruktorer. Exempel: lampa

Föreläsning 15: Repetition DVGA02

Transkript:

TDDD78 Objektorientering i Java, del 2 Objektvariabler är pekare vad är det? Hur används pekare för att sätta samman objekt (composition)? Hur används hierarkier för att modellera nära relaterade typer? jonas.kvarnstrom@liu.se 2016

Viktiga begrepp inte bara inom objektorientering

Motivation Programmeringsuppgift: Lagra en databas över anställda Håll reda på varje anställds närmaste chef som också är en anställd! 3 En första ansats: public class Employee { private String name; private Employee boss; // Och andra egenskaper public Employee(String name, Employee boss) { this.name = name; this.boss = boss; Hur ska detta lagras i praktiken?

Motivation (2): Innehåll? Ser ut som att en Employee innehåller en annan 4 Jag Chefen public class Employee { private String name; private Employee boss; public Employee(String name, Employee boss) { this.name = name; this.boss = boss;

Motivation (3): Innehåll? Kan bli problematiskt! 5 Många nivåer Jag Chefen Chefens chef Högsta chefen Hur får man stopp på det? Två platser i minnet olika objekt! Andra kan inte innehålla samma objekt! Min kollega Samma chef!

Motivation (4): En bättre lösning En anställd ska inte innehålla chefen, utan peka ut vem chefen är 6 Jag Min kollega Chefen Chefens chef Högsta chefen Så: Hur pekar man på ett annat objekt?

Variabler och minnesadresser 7 Programkod int: längd Minne vid körning 10 Använd minnesadresser! 10000 Finns alltid där "i bakgrunden": "int längd = 10;" "lagra 32-bitars heltal 10 på adress 10000 10003" "Employee me = new ;" "Skapa Employee-objekt på adress 50000 50047" int: höjd 5 10004 String: hälsning Employee: me "Hello" 40000 50000

Variabler och minnesadresser (2) 8 Programkod Minne vid körning I vissa språk får man veta minnesadresserna C: höjd == 5 &höjd == 10004 ("adressen till höjd") int: längd 10 10000 int: höjd 5 10004

Pekare (1) 9 Programkod Minne vid körning En variabel av pekartyp kan innehålla en adress C: "pekare till int" heter int* int* höjdpekare = &höjd; Värdet blir adressen 10004 int: längd int: höjd 10 5 10000 10004 int*: höjdpekare 10004 40000 Värdet 10004 är adressen till ett annat värde i minnet

Pekare (2): Tilldelning 10 Programkod Minne vid körning Ändra pekarens värde ändra vart den pekar C: int* höjdpekare = &höjd; höjdpekare = &längd; int: längd 10 10000 int: höjd 5 10004 int*: höjdpekare 10000 40000

Objektvariabler är pekare I Java är en objektvariabel alltid en pekare! Circle mycircle = new Circle(10, 20, 30); 12 Namn Värde i minnet Circle: mycircle 49152 10000 2. Skapa variabeln, låt den peka på obj. Object (data) header: x 10 y 20 r 30 49152 1. Skapa objektet (minne, konstruktor, ) mycircle är egentligen pekaren (4/8 bytes), inte objektet! Java gömmer dess numeriska värde (irrelevant för vår kod): Vi kan inte få fram talet 49152

Men vilka konsekvenser får detta?

Pekare i Java (1): Objektmedlemmar 14 Att komma åt medlemmar: T.ex. mycircle.x = 4711; Beräknar mycircle (49152); går automatiskt vidare till objektet på plats 49152 Hittar fältet x; ändrar dess värde Namn Circle: mycircle Värde i minnet 49152 10000 Object (data) header: x 4711 y 20 r 30 49152

Pekare i Java (2): Exempel 15 Namn Circle: c1 Värde i minnet 10000 Anta två cirklar: Circle c1 = new Circle(1,1,1); Circle c2 = new Circle(2,2,2); 5000 Circle: c2 Object (data) header: x 1 y 1 r 1 20000 10000 11000 Object (data) header: x 2 y 2 r 2 20000

Pekare i Java (3): Tilldelning 16 Namn Circle: c1 Circle: c2 Värde i minnet 10000 Object (data) header: x 1 y 1 r 1 10000 5000 10000 11000 Tilldela c2 = c1; c1, c2 är pekare Ändra pekarens värde ändra vart den pekar Sätter c2 till 10000 Kommer inte att kopiera själva cirkeln, fält för fält! Object (data) header: x 2 y 2 r 2 20000 Kvarvarande objekt som ingen pekar på inte ett problem i Java (skräpsamling)

Pekare i Java (4): 17 Namn Circle: c1 Circle: c2 Värde i minnet 10000 Object (data) header: x 100 y 1 r 1 10000 5000 10000 c2.x = 100; Nu är c1.x också 100 c1 och c2 pekar på samma objekt c1.x och c2.x är samma variabel! 11000 "Peter Dalenius" är en sträng "Kursens studierektor" är en annan Men de pekar ut samma person Om Peter Dalenius får ny chef, får kursens studierektor ny chef

Pekarexemplet (0) 18 public class Employee { private String name; private Employee boss; public Employee(String name, Employee boss) { this.name = name; this.boss = boss;

Pekarexemplet (1) 19 Employee 1 Minne name: "Employee 1" 10000 Employee 2 Employee 3 name: "Employee 2" 49152 boss: 10000 Med pekare: Många kan peka på samma objekt trots att själva objektet bara lagras en gång name: "Employee 3" boss: 10000 53284

Pekarexemplet (2) 20 Men anställd 1 har ingen chef! Vad ska boss fältet ha för värde? Minne name: "Employee 1" 10000 boss:??? name: "Employee 2" 49152 boss: 10000 name: "Employee 3" 53284 boss: 10000

Null-pekare 21 Objektpekare kan ha specialvärdet null Pekar "ingenstans" "inte applicerbart": Noden har ingen chef "vi vet inte än" Minne name: "Employee 1" boss: null 10000 Lagras ofta som adressen 0 Spelar ingen roll för oss I Java ser vi bara värdet null name: "Employee 2" boss: 10000 49152 Med pekare: Kan lätt ange avsaknad av värde name: "Employee 3" boss: 10000 53284

Null-pekare (2) Vad kan man göra om pekarens värde är null? 22 Använda själva pekarvariabeln if (this.boss == other.boss) // Jämför pekarnas värden (0 == 49152), // tittar inte efter något objekt // (Motsvarar operatorn "is" i Python) painter.draw(circle1) // Om circle1 == null, // får parametern till draw också värdet null Inte använda fälten och metoderna i objektet den pekar på! Den pekar ju inte på något objekt! this.boss = null; // OK this.boss.name = "Hello"; // Fel vid körning: NullPointerException boss:

Sammansättning 1 Anta en klass för 2D-positioner: public class Point { private double x, y; public Point(double x, double y) { this.x = x; this.y = y; public double getx() { return x; public double gety() { return y; public double getdistfromorigin() { return Math.sqrt(x*x + y*y); 24

Sammansättning 2 Skapa en cirkelklass två alternativ: public class Circle { // Alla fält är primitiva typer, som tidigare private double x, y, r; public Circle(double x, double y, double r) { this.x = x; this.y = y; this.r = r; Implementera allt från början public class Circle { // Fält kan vara objekt private Point center; private double r; public Circle(Point center, double r) { this.center = center; this.r = r; Använd existerande punktklassen! Sammansättning = composition 25

Sammansättning 3 Med sammansättning: En cirkel har en punkt, eller består av en punkt (och en radie) Återanvändning av existerande kod (Point kunde vara komplicerad) Mindre upprepning bra! 26 Exempel i labb: Listor finns redan En kö har en lista där den kan lagra sina element public class Circle { // Fält kan vara objekt private Point center; private double r; public Circle(Point center, double r) { this.center = center; this.r = r;

Sammansättning och delegering Om man vill ge tillgång till "komponentens" funktionalitet: Delegera! 27 public class Circle { // Fält kan vara objekt private Point center; private double r; public Circle(Point center, double r) { this.center = center; this.r = r; public double getdistfromorigin() { return center.getdistfromorigin(); Vad är cirkelns avstånd till origo? Samma som punktens!

Sammansatt objektstruktur 1 I vissa språk: Sammansatta objekt är sammansatta i minnet public class Circle { Point center; double radius; Circle c1 = new Circle(); 28 c1 Object header: x y (data) radius 0.0 0.0 "Point-delen" 0.0 av en cirkel

Sammansatt objektstruktur 2 Men Javas objektvariabler är alltid pekare! Ett "sammansatt" objekt består egentligen av flera separata objekt class Circle { En Circle består av Point center; en Point-pekare (inte en Point) double radius; en double Circle c1 = new Circle(); 29 c1 Object header: center radius (data) 0.0 Object header: x y (data) 0.0 0.0

Sammansatt objektstruktur 3 Konsekvenser: Som vi såg för pekare tidigare Exempel: Två cirklar kan ha samma centrumobjekt Point center = new Point(10, 20); Circle c1 = new Circle(center, 7); Circle c2 = new Circle(center, 12); 30 c1 Object header: center radius (data) 7.0 Object header: x y (data) 10.0 20.0 c2 Object header: center radius (data) 12.0

jonas.kvarnstrom@liu.se 2016 Typhierarkier: Gränssnitt, ärvning, subtypspolymorfism,

Repetition: Klasser Vi har pratat om klasser av objekt i verkligheten 32 Tydliga olikheter separata klasser

Liknande objekt Hur gör vi när objekten är "ganska lika"? 33 En klass: Generella motorfordon? Bra: Vi kan generalisera "Detta gäller alla motorfordon" Tre klasser: Bilar, bussar och lastbilar? Bra: Vi kan vara specifika "Detta gäller bara bussar" Fem klasser: Bil, lätt lastbil, tung lastbil, minibuss, buss?

Hierarkier av klasser 34 Vi kan ha hierarkier med både generella och specifika klasser! Fordon "is-a"-relation (en bil är en sorts motorfordon) Motorfordon

Hierarkier och delmängder En delmängdsrelation mellan klassernas objekt 35 Fordon Motorfordon Alla motorfordon är fordon Cykel Bil Buss Med denna hierarki: En bil kan aldrig vara en buss, är alltid ett motorfordon

Liknande datatyper (1) Samma situation uppstår med datatyper hur lagras listor? 36 "Linjärt"? Länkad lista? Object header pos 0 (data) 0.0 pos 1 10.0 pos 2 20.0 237000 7826.0 Object header value next Object header value next (data) 0.0 (data) 20.0 Object header value next Object header value next (data) 10.0 (data) 7826.0 Snabbt att slå upp element 92000: Adress = liststart + 92000 * elementstorlek Långsamt att stoppa in ett element: Måste flytta alla efterföljande element Långsamt att slå upp element 92000: Gå till start, följ pekare 92000 gånger Snabbt att stoppa in ett element: Ändra två pekare

Liknande datatyper (2) Många olika sorters listor: LinkedList, ArrayList, SkipList, Stora skillnader i implementation Olika klasser Mycket gemensamt t.ex. metoder int size(); Object get(int index); void set(int index, Object element); 37 LinkedList ArrayList SkipList size(): int get(int pos): Object add(object element): Object set(int pos, Object element): void insert(): void size(): int get(int pos): Object add(object element): Object set(int pos, Object element): void size(): int get(int pos): Object add(object element): Object set(int pos, Object element): void

Liknande datatyper (3) Vill inte behöva ange exakt typ, bara "någon sorts lista" void quicksort(arraylist somelist) { // Kräver ArrayList! 38 // Men skulle fungera med många // klasser som har size(), get(), set(), ArrayList getnames() { // Lovar att returnera ArrayList! // Anropare kan förlita sig på detta // måste fortsätta med samma typ

Duck Typing 39 Python class ArrayList: def extend(self, list): class LinkedList: def extend(self, list): Duck Typing: When I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck James Whitcomb Riley def add_lists(list1, list2): list1.extend(list2) return list1 Har en ArrayList-klass Funktioner kollar aldrig typen bara att medlemmarna finns!

Utan Duck Typing 40 Java class ArrayList { definierar addall() class LinkedList { definierar addall() public static ArrayList add_lists(arraylist list1, ArrayList list2) { list1.addall(list2); return ret; Måste ange parametertyp Hur kan vi ange "ArrayList eller LinkedList"?

Typhierarkier 1 En hierarki av datatyper! 41 List size(): int get(int pos): Object add(object element): Object set(int pos, Object element): void List: Generell sekvens/lista LinkedList ArrayList SkipList En LinkedList är en sorts List

Typhierarkier 2: Terminologi Terminologi: List size(): int get(int pos): Object add(object element): Object set(int pos, Object element): void List är supertyp till LinkedList 42 LinkedList ArrayList SkipList LinkedList är subtyp till List supertyp = supertype subtyp = subtype

Typhierarkier 3: Vad vinner vi? Nu kan vi skriva om: 43 void quicksort(arraylist somelist) { // Kräver ArrayList! // Men skulle fungera med många // klasser som har size(), get(), set(), void quicksort(list somelist) { // Kan ta emot ArrayList, SkipList, //! ArrayList getnames() { // Lovar att returnera ArrayList! // Anropare kan förlita sig på detta // måste fortsätta med samma typ List getnames() { // Lovar bara List: // Vi kan fritt byta vilken typ av lista // som returneras! Lova mindre!

Specifikation utan implementation

Bakgrund: Abstrakta datatyper En abstrakt datatyp (ADT): Talar om vilken information som ska finnas En lista innehåller ett antal (n) element Varje element har ett unikt index, [0..n 1] Talar om vilka operationer som finns (ADT är inte OO-specifikt!) int size(list list) void Element void List List add(list list, Element el) get(list list, int index) set(list list, int index, Element el) createandinitializelist() createandinitializelist(int capacity) 45 Säger inget om implementationen, representationen! Enbart hur datatypen ska fungera, vad den ska uppfylla Många varianter kan implementeras Anger ett kontrakt Formellt: En matematisk definition Abstrakt datatyp = abstract data type

Interface 1: Metodsignaturer, specifikation 46 Ett interface (gränssnitt) är just specifikation utan implementation /** An ordered collection (also known as a sequence). Elements in the list are indexed beginning at 0 and */ public interface List { /** Returns the number of elements in this list. */ int size(); Object get(int index); void add(object element); void set(int index, Object element); Gränssnitt kan inte instansieras new List()? Det finns ingen kod för dess metoder! Dokumentation anger krav för alla som implementerar List Metodsignaturer: Returtyp, namn, parametrar Inga fält, ingen kod Metoder i ett gränssnitt är alltid (underförstått): public tillgängliga för alla abstract ej implementerade här

Interface 2: Implementation 47 En Java-klass kan implementera ett gränssnitt class ArrayList implements List { private Object[] elements; private int length; Ett löfte att uppfylla vad gränssnittet lovar ("kontrakt") public int size() { return length; public Object get(int index) { return elements[index]; public void add(object element) { public void set(int index, Object element) { Kompilatorn verifierar att metoderna finns Programmeraren verifierar att kontraktet i övrigt är uppfyllt public void shuffle() { Kan ha fler metoder än gränssnittet (starkare kontrakt) implementera = implement

Interface 3: Typhierarki En typhierarki 48 Sortable <<interface>> sort(comparator c) : void List <<interface>> size(): int get(int pos): Object add(object element): Object set(int index, Object element): void Kan implementera flera gränssnitt Sortable och List är supertyper till LinkedList LinkedList head: Object tail: LinkedList sort(comparator c) : void size() : int LinkedList är en subtyp till Sortable och List elements: Object[] length: int ArrayList size() : int get(int pos): Object add(object element): Object set(int index, Object element): void size() : int SkipList

UML: Klassdiagram med gränssnitt 49 UML-diagram: Klassrelationen realisering Ett gränssnitt är bara en beskrivning Klasser realiserar gränssnittet: Ger en konkret implementation Streckad pil, tom pilspets Medlemmar visas: Där de deklareras första gången Där de implementeras List <<interface>> size(): int get(int amount): Object add(object element): Object set(int index, Object element): void LinkedList ArrayList SkipList head: Object tail: LinkedList size() : int elements: Object[] length: int size() : int get(int amount): Object add(object element): Object set(int index,object element): void size() : int

Om man har flera "klassvarianter" med gemensam bas: Oftast bör man ha ett gränssnitt, så den gemensamma basen kan användas List LinkedList SkipList ArrayList

Sammanhang 51 Kontrakt Gränssnitt Abstrakt datatyp

Objekt med flera typer Ett objekt har nu flera typer Varje LinkedList är också av typen List och Sortable 53 Sortable List LinkedList SkipList ArrayList Bird Duck Owl Dodo Vilka effekter får det?

Peka på en subtyp 54 En objektvariabel kan peka på objekt av godtycklig subtyp List names = new ArrayList(); Bird mybird = new Duck(); En ArrayList är ju en List Så vilken typ har variabeln egentligen? En objektvariabel kan pekas om till ett objekt av annan typ List numbers = new SkipList(); numbers = new LinkedList(); Både SkipList och LinkedList är ju specialfall av List Så kan variabler byta typ?

Typer: Apparent / Actual Med typhierarkier: List windows = application.getwindows(); 55 Variabelns typ kallas static / apparent type List: windows Variabel av typ List List get() add() (no impl) (no impl) Känt av kompilatorn Statiskt: Variabelns typ är oföränderlig Object header Node: head Node: tail (data) LinkedList get() [LL-get] add() [LL-add] print() [] Värdet vid exekvering blir av typen LinkedList Generellt bara känt vid körning Kan ändras under körning Objektets typ kallas dynamic / actual type

Synliga (tillgängliga) medlemmar Givet en variabel, vilka metoder och fält är synliga? List windows = application.getwindows(); 56 List: windows Variabel av typ List List get() add() (no impl) (no impl) I Java: De som finns i variabelns (uttryckets) typ! windows.get(), windows.add() Object header Node: head Node: tail (data) LinkedList get() [LL-get] add() [LL-add] print() [] Värdet vid exekvering blir av typen LinkedList Kompilatorn vet inte att värdet kommer att vara en LinkedList Vi kan inte anropa windows.print()!

Statisk typkontroll Så typkontrollen är fortfarande statisk class Application { List getwindows() { SkipList getfiles() { 57 Application app List windows List files = ; = app.getwindows(); = app.getfiles(); Kompilatorn testar: getfiles() returnerar SkipList, files är av typ List Allt OK!

Vem vet mest? 58 Men tänk om vi vet mer än kompilatorn! Vi har listor av fåglar public class BirdList { void add(bird foo) { Bird get(int index) { Vi stoppar in något först i listan BirdList lista = new BirdList(); lista.add(new Owl()); Vi plockar ut det Bird a = lista.get(0); Owl b = lista.get(0); Duck // Kompilatorn accepterar Owl Bird Dodo // Fel! Metoden get() lovar bara att ge oss en Bird, // och inte alla fåglar är ugglor Men vi vet ju vad vi stoppade in där!

Att veta mer (2) 59 Vi kan tala om för kompilatorn vad vi vet! Använd en cast Owl b = (Owl) lista.get(0); En object-cast är ett löfte: Fågeln är faktiskt en uggla!" Resultatet är en ny pekare till samma objekt Inte ett nytt "konverterat" objekt! Bird: lista.get(0) Om man ljuger: ClassCastException (här finns dynamisk typkontroll, dvs. vid körningen!) Owl: (Owl) lista.get(0) Object header value (data) 10

Namnbindning 61 Namnbindning: Givet en identifierare (namn), vilken variabel / fält / metod / menar vi? För variabler tar kompilatorn reda på detta: class Binding1 { void foo() { int index = 100; int other = 200; System.out.println(index); // "index" binds till metodens första variabel class Binding2 { int index = 100; void foo() { int other = 200; System.out.println(index); // "index" binds till objektets första fält Detta är statisk bindning = tidig bindning: Sker före programmet körs

Bindning av metoder Att binda metodnamn till implementation: 62 Utan typhierarkier Variabelns typ = objektets typ Statisk bindning är möjlig ArrayList mylist = ; mylist.add(); Vilken variant av add()? Måste vara ArrayList:s! Känt vid kompileringen: Namnet add() kan statiskt bindas till en funktion av kompilatorn Med typhierarkier Variabelns typ!= objektets typ Dynamisk bindning krävs List mylist = ; mylist.add(); Vilken variant av add()? ArrayList:s? LinkedList:s? Okänt vid kompileringen: Namnet add() måste dynamiskt bindas till en funktion vid körning

Metodtabeller Varje objekt känner till sin klass Varje klass känner till sin metodkod 63 Klassinfo med metodtabell Virtual method table: vtable List: names1 List-metoder: Object get(int index), void add(object o), Object header: head tail (data) LinkedList get() [LL-get] add() [LL-add] print() []

Dynamisk bindning 64 Dynamisk bindning = sen bindning = dynamisk dispatch Objektets typ avgör List names1 = foo.getnames(); // Returnerar en LinkedList names1.add(n1); // LinkedList-implementationen av add List names2 = bar.getnames(); // Returnerar en ArrayList names2.add(n1); // ArrayList-implementationen av add Objektet talar (indirekt) om för oss var implementationen finns: List: names1 List: names2 Object header: head tail (data) LinkedList get() [LL-get] add() [LL-add] print() [] List-metoder: Object get(int index), void add(object o), Object header: length elements (data) ArrayList get() add() [AL-get] [AL-add]

Dynamisk bindning är nödvändigt! Kan vara omöjligt att analysera typen i förväg! 65 public class RandomList { public static void main(string[] args) { List list = getlist(); list.add(); // Vilken typ var det? private static List getlist() { if (Math.random() > 0.5) return new ArrayList(); else return new LinkedList();

Subtypspolymorfism 66 Typhierarkin + sen bindning ger oss Subtypspolymorfism πολυμορφισμός = som har flera former Här: Ett metodnamn, deklarerat i en typ Flera implementationer, skrivna i subtyperna Kallas ofta enbart "polymorfism" men polymorfism är egentligen bredare begrepp Sortable List LinkedList SkipList ArrayList

Overloading Kontrasteras med överlagring = ad-hoc-polymorfism Samma namn, flera implementationer (för olika argumenttyper) class Printer { void print(int val) { void print(double val) { void print(double val, int precision) { Inte ett OO-begrepp mer allmänt! 67 Alla varianter är kända vid kompileringen Ger statisk bindning

Interface-ärvning 1: Hierarkier Vi har sett typhierarkier i två nivåer 69 Gränssnitt anger funktionalitet: Vad som är gemensamt för alla listor List <<interface>> size(): int get(int pos): Object add(object element): Object set(int index, Object element): void Klasser ger oss implementationer LinkedList ArrayList SkipList

Interface-ärvning 2: Gemensamt Men List har också något gemensamt med Set 70 Set <<interface>> size(): int add(object element): Object List <<interface>> size(): int get(int pos): Object add(object element): Object set(int index, Object element): void Hur deklarerar vi en variabel som kan peka på en lista eller en mängd? LinkedList ArrayList SkipList

Interface-ärvning 3: En nivå till Genom ytterligare en nivå! Collection <<interface>> 71 size(): int add(object element): Object Set <<interface>> size(): int add(object element): Object List <<interface>> size(): int get(int pos): Object add(object element): Object set(int index, Object element): void LinkedList ArrayList SkipList

Interface-ärvning 4 Detta är interface-ärvning interface Collection { void add(object obj); boolean contains(object obj); interface List extends Collection { void set(int index, Object obj); 72 Collection är ett superinterface till List List utökar eller ärver från Collection List är ett underinterface till Collection List extends or inherits from Collection List is a subinterface of Collection Set Collection List Ärver Adderar kontrakt/löften: Collection lovar att ha en add()-metod, egna löften: List lovar också

Interface-ärvning 5: Multipel ärvning Multipel ärvning tillåts för gränssnitt interface SortableList extends Sortable, List { // Kombinerar supertypernas löften / kontrakt // Inget nytt adderat interface NetworkSocket extends DataInput, DataOutput { // Kombination av två supertyper // Plus: ytterligare en metod krävs public NetworkAddress getremotehost(); 73 Sortable List SortableList multipel ärvning = multiple inheritance

UML-klassdiagram: Generalisering Klassrelation: Generalisering (ärvning) List specialiserar Collection (lägger till nya krav, nya metoder) Collection generaliserar List Vanlig linje, tom pilspets Collection <<interface>> 74 +size(): int +add(object element): Object +contains(object element): boolean List <<interface>> +get(int index): Object +set(int index, Object element): void