49
next previou s Arv, polymorfi och gränssnitt Innehåll Arv Subtyp, ersättbarhet Olika former av arv Polymorfi Abstrakta klasser och gränssnitt OOMPA 2000 Föreläsning 3

Arv, polymorfi och gränssnitt

  • Upload
    ranae

  • View
    45

  • Download
    0

Embed Size (px)

DESCRIPTION

Innehåll Arv Subtyp, ersättbarhet Olika former av arv Polymorfi Abstrakta klasser och gränssnitt. OOMPA 2000 Föreläsning 3. Arv, polymorfi och gränssnitt. Arv. Arv är fundamentalt i objektorienterad programmering - PowerPoint PPT Presentation

Citation preview

Page 1: Arv, polymorfi och gränssnitt

nextprevious

Arv, polymorfi och gränssnitt

Innehåll

Arv

Subtyp, ersättbarhet

Olika former av arv

Polymorfi

Abstrakta klasser och gränssnitt

OOMPA 2000Föreläsning 3

Page 2: Arv, polymorfi och gränssnitt

previous next 2

Klasser,arv, polymorfi, mm

Arv• Arv är fundamentalt i objektorienterad programmering

– För att ett språk skall kallas objektorienterat så måste arv ingå som en möjlig väg att återanvända kod och beskrivningar

– I programspråksammanhang låter vi subklasser ärva både struktur och attribut från superklasser

• dvs både variabler och metoder ärvs

A

B C

E

D

Shape

bounds() :Rectangledraw() : voidextent() : Point

position : Point

Shape1

draw() : void

extent : Point

Shape2

draw() : void

extent : Point

Page 3: Arv, polymorfi och gränssnitt

previous next 3

Klasser,arv, polymorfi, mm

..arv• Arv kan delas in i två huvudtyper

– Arv för specifikation• dvs arv av protokoll

– Arv av kod• dvs arv av beteende och struktur

• Arv kan vara av olika typ– Generalisering (eng. extension)

• subklassen är rikare än, eller en utvidgning av, superklassen

– Specialisering (eng. specialisation)• subklassen är mer specialiserad än, eller ett specialfall av, superklassen

• Arv är transitivt– Om A superklass till B och B superklass till C så ärver C

attribut och beteende från både B och A

Page 4: Arv, polymorfi och gränssnitt

previous next 4

Klasser,arv, polymorfi, mm

Javas basklass Object• Klassen Object är överst i Javas klassträd

Boolean Number

Byte

String

Integer

Graphics Component

Button Label Container

Window Panel

Object

equals(obj : Object) : booleantoString() : StringgetClass() : String

Klassen Object med några subklasser

och några viktiga metoder

Page 5: Arv, polymorfi och gränssnitt

previous next 5

Klasser,arv, polymorfi, mm

Exempel: Klassen Circle (klassdiagram)

Circle

+ x : double+ y : double+ r : double

+ circumference() : double+ area() : double+ main(String []) : void

attributhär alla publika

klassnamn

metoderalla publika

två instansmetoderen klassmetod

Page 6: Arv, polymorfi och gränssnitt

previous next 6

Klasser,arv, polymorfi, mm

... Javakod/* Klassdefinition (utan extends innebär subklass till

Object) */ public class Circle {

public double x, y;public double r;

public double circumference(){return 2 * 3.14 * r;}public double area(){return 3.14 * r * r;}

// för att testa skriver vi en static main-metod // som används då man kör från terminal

public static void main (String args[]) {//Vi deklarerar en temporär variabelCircle circle;// och instansierarcircle = new Circle();

attributinstansmetoder

klassmetod

Page 7: Arv, polymorfi och gränssnitt

previous next 7

Klasser,arv, polymorfi, mm

... forts ...

//vi ändrar några värden

circle.x = 100; circle.y = 200; circle.r = 20;

// vi gör några testutskrifter

System.out.println("Cirkelns x-koordinat: " +

circle.x + " och dess y-koordinat: "

+ circle.y); System.out.println("den har en radie också: " +

circle.r); System.out.println(

"genom anrop av metoden circumference: " +circle.circumference() +" fick vi omkretsen");

System.out.println("och med area:" + circle.area() +

" dess area");

}

}

Page 8: Arv, polymorfi och gränssnitt

previous next 8

Klasser,arv, polymorfi, mm

... och så sparar vi, kompilerar och kör

• Spara

– Spara filen med samma namn som klassen med extension .java, dvs här Circle.java

• Kompilera

javac Circle.java– Skapar en fil Circle.class

• Kör

java Circle

Page 9: Arv, polymorfi och gränssnitt

previous next 9

Klasser,arv, polymorfi, mm

Exempel på UML och Java (från Fii): lampa

Light1

# isOn : boolean

+ turnOn() : void+ turnOff() : void+ isOn() : boolean+ toggle() : void+ main(String []) : void

onoff

toggle

toggle

Page 10: Arv, polymorfi och gränssnitt

previous next 10

Klasser,arv, polymorfi, mm

… Light1, Javakodpublic class Light1 {

protected boolean isOn;public void turnOn() {isOn = true;}public void turnOff() {isOn = false;}public boolean isOn() {return isOn;}public void toggle() {isOn = !isOn();}

public static void main (String args[]) {Light1 light;light = new Light1();System.out.println(light.isOn()); //ska ge falselight.toggle();System.out.println(light.isOn()); // ska ge true

}}

Page 11: Arv, polymorfi och gränssnitt

previous next 11

Klasser,arv, polymorfi, mm

Exempel: lampa2, med start i on-läge

onoff

toggle

toggle

Page 12: Arv, polymorfi och gränssnitt

previous next 12

Klasser,arv, polymorfi, mm

... Light2, Javakodpublic class Light2 {

// defultvärde för isOn kan anges vid deklarationen

protected boolean isOn = true;

// medlemsmetoderna som förut...

public static void main (String args[]) {

Light2 light;

light = new Light2();

System.out.println(light2.isOn()); //true

light.toggle();

System.out.println(light.isOn()); //false

}

}

Page 13: Arv, polymorfi och gränssnitt

previous next 13

Klasser,arv, polymorfi, mm

Subklass, subtyp och ersättbarhet• Abstrakt datatyp

– Är en inkapsling av data och dom metoder som opererar på dessa data

• Subtyp– En viss typ A är subtyp till en annan typ B omm A åtminstone erbjuder

samma beteende som B och att A kan användas överallt där B kan användas utan att någon skillnad kan observeras

• Subklass– En subklass ärver struktur och beteende från sina superklasser

– En subklass kan berika, inskränka eller förändra det ärvda beteendet från sina superklasser

• Ersättbarhet– Ett objekt av typ A som är subtyp till typen B kan användas som om det

vore av typ B eftersom det åtminstone uppvisar B:s beteende

Page 14: Arv, polymorfi och gränssnitt

previous next 14

Klasser,arv, polymorfi, mm

Olika former av arv• Arv för specialisering

– subklassen är ett specialfall av superklassen, dvs subklassen är en subtyp till superklassen

• En Tandemcykel är en speciell sorts Cykel

• Arv för specifikation– Superklassen specificerar beteende som inte är implementerat

i superklassen men måste implementeras i dess subklasser• Ett Fordon specificerar en Bil och Cykel

• Arv för konstruktion– Subklassen utnyttjar superklassens beteende men är inte

subtyp till superklassen• En FigurGrupp kan implementeras mha av en Vector

Page 15: Arv, polymorfi och gränssnitt

previous next 15

Klasser,arv, polymorfi, mm

...• Arv för utvidgning

– Subklassen lägger till ny funktionalitet i förhållande till superklassen men förändrar inte existerande beteende

• En Egenskapslista kan implementeras genom att utvidga en HashTable (en hashad tabell med nyckel/värde-par)

• Arv för begränsning– Subklassen inskränker superklassens beteende

• En MängdKlass kan implementeras som en "inskränkt" Vector

• Arv för kombination– Subklassen ärver från mer än en superklass

• En Amfibiebil kan implementeras genom att kombinera en Bil med en Båt

Page 16: Arv, polymorfi och gränssnitt

previous next 16

Klasser,arv, polymorfi, mm

Exempel: olika typer av arv

Ellipse

Circle

Window

Win95Window MacWindow

Arv för specialisering

Arv för specifikation

Car Bike Lorry MotorCycle

MotorLandVehicle

tankengine

wheels()speed()

Page 17: Arv, polymorfi och gränssnitt

previous next 17

Klasser,arv, polymorfi, mm

...

Arv för konstruktion Arv för utvidgning Arv för begränsning

Arv för kombination

Polyline

Cartoon

Vector

Stack Ellipse

Circle Vector

Set

Collection

GraphicComponent

GraphicObject Car

AmfibieCar

Boat

Page 18: Arv, polymorfi och gränssnitt

previous next 18

Klasser,arv, polymorfi, mm

Modifierare och arv• I Java kan vi använda modifierare för att kontrollera arv eller "synbarhet"

– public

• kan användas överallt

– protected

• kan användas i klass eller subklasser

– private

• kan bara användas inne i klassens beskrivning

– static

• klassmetod eller klassvariabel

– final

• kan ej ändras (variabelfallet), kan ej subklassas (klassfallet)

– abstract

• måste specificeras i subklasser

– ingen

• package visibility

Page 19: Arv, polymorfi och gränssnitt

previous next 19

Klasser,arv, polymorfi, mm

Fördelar med arv• Återanvändning av mjukvara

– Enkelt att modifiera passande klass (på ett strukturerat sätt)

• Ökad tillförlitlighet– Klasser i "bibliotek" som används av många blir hela tiden

testade

• Delande av kod– Likartade komponenter kan dela (stora delar) kod som kan

beskrivas i gemensam superklass

• Överenstämmande gränssnitt– Klasser som ärver från gemensam superklass överenstämmer

troligare än om dom ärver från separata grenar

Page 20: Arv, polymorfi och gränssnitt

previous next 20

Klasser,arv, polymorfi, mm

...• Mjukvarukomponenter

– Arv gör det enkelt att konstruera återanvändbara komponenter

• Snabb konstruktion av prototyper– Ofta snabbt att återanvända klasser och endast ändra det som

skiljer

• Polymorfi och frameworks– Genom polymorfi och arv är det relativt enkelt att beskriva

systemstruktur och beteende på hög nivå vars detaljer sedan kan beskrivas av användarnas konkreta subklasser

• Inkapsling av information– Ofta tillräckligt att känna till superklassens protokoll utan

detaljer om dess implementation

Page 21: Arv, polymorfi och gränssnitt

previous next 21

Klasser,arv, polymorfi, mm

Kostnader för arv• Exekveringshastighet

– Viss extra kostnad för metoduppslagning

• Programstorlek– Programbibliotek ger ofta mer binärkod än specialdesignade

klasser

• Programkomplexitet– Kod skriven med djupa arvshierarkier ger ofta komplexa

strukturer med svårgripbara programflöden

– Jo-Jo-problemet: där metoder än i superklasser än i subklasser används om vartannat

Page 22: Arv, polymorfi och gränssnitt

previous next 22

Klasser,arv, polymorfi, mm

Javaexempel: Klass Person med definition av printrutinimport java.util.Date;

public class Person {

public String name = "";

public Date dateOfBirth;

public Person(String name, Date date)

{this.name = name; dateOfBirth = date;}

public Person(String name) {this(name, new Date());}

public int age(){

Date now = new Date();

return now.getYear() - dateOfBirth.getYear();}

// med toString definierar vi hur objektet presenterar sig public String toString(){

return "Namn: " + name + " född: " + dateOfBirth;

}

Page 23: Arv, polymorfi och gränssnitt

previous next 23

Klasser,arv, polymorfi, mm

och så prövar vi bla toStringpublic static void main (String args[]) {

Person p1 = new Person("Kalle");

System.out.println(p1);

}

}

• Utmatning i stil med:

Namn: Kalle född: Mon Sep 21 15:45:01 MET 1998

Page 24: Arv, polymorfi och gränssnitt

previous next 24

Klasser,arv, polymorfi, mm

Vi kan använda super(…) pss som this(…)• Ibland vill vi anropa konstruktor i superklassen• Då skriver vi super(…), med aktuellt antal argument, så

anropas motsvarande konstruktör i superklassen.– super(…) måste precis som this(…) stå först

• Observera: Om vi varken skriver this(…) eller super(…) så lägger Java implicit in super() först i konstruktorn

Typ

Typ()Typ(T t)

Undertyp

UnderTyp()UnderTyp(T t) super(t);

Page 25: Arv, polymorfi och gränssnitt

previous next 25

Klasser,arv, polymorfi, mm

Med super kan vi använda metoder i superklasspublic class Employee extends Person {

// en statisk (klassvariabel) används för att räkna// anställda (dvs egentligen antal instanser)

static int numberOfEmployers = 0;public int number;

// Med super kommer vi åt superklassens definition

public String toString(){return super.toString() + " anställningsnummer: " + number;}

// för att använda superklassens konstruktor används också //super som skall stå först, med syntax: super(ARGUMENT)

public Employee(String name) {super(name);

numberOfEmployers = numberOfEmployers + 1;number = numberOfEmployers;

}}

super.

super(..)

Page 26: Arv, polymorfi och gränssnitt

previous next 26

Klasser,arv, polymorfi, mm

Mekanismer för återanvändning av mjukvara• Ersättbarhet

– Vi strävar efter att skriva programvara där vissa komponenter kan ersättas av andra utan att påverka några andra delar av systemet

• Är-en eller har-en– Ofta användbar tumregel:

• använd arv då en komponent är-en (specialisering) av någon annan– en tandemcykel är-en cykel, en bil är-ett fordon, en student är-en person

• använd komposition då en komponent har-en annan komponent som en av sina delar

– en bil har-em motor, en människa har-en vän

• Arv av kod eller arv av beteende– Arv av gemensam klass bör väljas då kod och struktur delas

– Ett gränssnitt bör delas då specifikation av beteende men inte den egentliga koden delas

Page 27: Arv, polymorfi och gränssnitt

previous next 27

Klasser,arv, polymorfi, mm

Komposition eller arv• Klassen Vector ser förenklat ut på följande sätt:class Vector{

public boolean isEmpty() {...}

public int size() {...}

public void addElement(Object value) {...}

public Object lastElement() {...}

public Object removeElementAt(int index) {...}

...

}

• Nu kan vi konstruera en stack genom att utnyttja Vector med 1) komposition eller 2) arv

Page 28: Arv, polymorfi och gränssnitt

previous next 28

Klasser,arv, polymorfi, mm

... komposition ...

Vectordata

isEmpty() : booleanpush(v : Object) : voidpeek(): Objectpop() : ObjectStack() : Stack

Stack

Page 29: Arv, polymorfi och gränssnitt

previous next 29

Klasser,arv, polymorfi, mm

...komposition...class Stack{

protected Vector theData;

public Stack() {theData = new Vector();}

public boolean isEmpty() {return theData.isEmpty();}

public void push(Object v) {theData.addElement(v);}

public Object peek() {return theData.lastElement();}

public Object pop(){Object result = peek();

theData.removeElement(theData.size() - 1);

return result;

}

}

Page 30: Arv, polymorfi och gränssnitt

previous next 30

Klasser,arv, polymorfi, mm

... arv ...

Vector

push(v : Object) : voidpeek(): Objectpop() : Object

Stack

Page 31: Arv, polymorfi och gränssnitt

previous next 31

Klasser,arv, polymorfi, mm

... arvclass Stack extends Vector{

public void push(Object v) {addElement(v);}

public Object peek() {return lastElement();}

public Object pop(){Object result = peek();

removeElement(size() - 1);

return result;

}

}

Page 32: Arv, polymorfi och gränssnitt

previous next 32

Klasser,arv, polymorfi, mm

Arv eller komposition?• Arv ger implicit (eller explicit) antagande om ersättbarhet

– Subklasser antas vara subtyper

– Detta "antagande" gäller inte för komposition

• Komposition är enklare än arv– Komposition anger mer tydligt vilka operationer som kan tillämpas på en

viss klass

• Vid arv är subklassernas mängd av operationer en supermängd av superklassens mängd av operationer– Programmeraren måste undersöka superklassen för att ta reda på vilka

operationer som är legala för subklassen

• Arv ger kortare beskrivningar än komposition

• Arv förhindrar inte manipulation av den nya strukturen via ("illegala") operationer i superklassen

Page 33: Arv, polymorfi och gränssnitt

previous next 33

Klasser,arv, polymorfi, mm

...• Komposition döljer implementationsdetaljer mer än vad

arv gör– Det är enkelt att ersätta en viss struktur med en annan

• En stack kan använda en vektor, byta till en länkad lista eller använda sig av en databas

• Vid arv har subklasser tillgång till alla icke privata fält i superklassen medan man vid komposition endast har tillgång till publika fält

• Arv låter oss använda den nya abstraktionen som argument i en polymorf funktion

Page 34: Arv, polymorfi och gränssnitt

previous next 34

Klasser,arv, polymorfi, mm

...• Vid arv får vi kortare kod än vid komposition. Därmed

blir koden mer överskådlig. Å andra sidan är gränssnittet mer tydligt vid komposition – Vid arv måste man fråga sig: Vilka delar av den ärvda koden

är tänkt att användas? Vilka delar är nödvändiga eller riskabla att initiera respektive förändra?

• En implementation med arv har en liten fördel i exekveringstid– Ett extra funktionsanrop behövs vid komposition

Page 35: Arv, polymorfi och gränssnitt

previous next 35

Klasser,arv, polymorfi, mm

Polymorfa variabler• Polymorf från grekiskans poly = många och morf = form• En polymorf variabel är en som kan vara deklarerad att hålla ett

värde av viss typ men som i verkligheten håller ett värde av en annan typ

• Ren polymorfi– Då en metod kan appliceras på argument av olika typer

• Överlagring (eller ad hoc polymorfi)– En metod med visst namn kan ta olika typer av argument

• Överskrivning– En metod med ett visst namn kan skrivas om (eller skrivas över) i en

subklass

• Abstrakt metod– En abstrakt metod är en metod vars signatur är deklarerad i en superklass

men implementationen görs i (konkreta) subklasser

Page 36: Arv, polymorfi och gränssnitt

previous next 36

Klasser,arv, polymorfi, mm

Exempel: polymorfi• Metoden println i Java kan ta argument av olika typ

– Klassen PrintStream implementerar tio olika varianter av metoden, allt från en version utan argument, till versioner som tar olika primitiva typer som argument till sådana som tar vektorer, strängar repsktive Object som argument

• Klassen String implemementerar blacompareTo(Object) compareTo(String)

– ochindexOf(int)indexOf(int, int)indexOf(String)indexOf(String, int)

Page 37: Arv, polymorfi och gränssnitt

previous next 37

Klasser,arv, polymorfi, mm

Överlagring• Överlagring och omvandling

– Vissa överlagrade metoder gör också omvandlingar mellan olika typer av objekt

– Typexempel aritmetiska operationer (+, -, *, /) där tex en int omvandlas till en float om en float ingår (int · float -> float)

• Överlagring mellan eller inom klasser– Metod med visst namn kan finnas i flera klasser

– Flera metoder med samma namn kan finnas i en viss klass

• Parmeteröverlagring– Olika metoder med samma namn i en viss klass är tillåtna så

länge som parametrarna skiljer i antal eller typ

Page 38: Arv, polymorfi och gränssnitt

previous next 38

Klasser,arv, polymorfi, mm

Exempel: överlagring• I en klass för tex grafiska objekt skulle vi kunna ha

– move(int x, int y)– move(Point p)

• En klass Circle skulle kunna ha konstruktörerna– Circle(int x, int y, int r)– Circle(Point p, int r)– Circle(Circle c)

Page 39: Arv, polymorfi och gränssnitt

previous next 39

Klasser,arv, polymorfi, mm

Överskrivning• Ersätta

– Koden i superklassen ersätts med kod i subklassen

– Detta görs genom att metoder med samma namn och argumenttyper som i superklassen definieras om i subklassem

• Förändra– Koden från superklassen kombineras med kod från subklassen

– Detta görs genom att metod ersätts men att superklassens metod anropas

• i Java mha super.metod(...)alternativt i konstruktörer super(..)

Page 40: Arv, polymorfi och gränssnitt

previous next 40

Klasser,arv, polymorfi, mm

Exempel överskrivning• Antag att vi har en klass Figure, en subklass Ellipse med subklass Circle– Antag att rotation är implementerat via en metod rotate(int

angle) i superklasserna

– En rotation av en cirkel syns inte på skärmen därför skulle vi kunna effektivisera och skriva metoden rotate i Circle på följande sättpublic void rotate(int angle) {}

• I Java definierar metoden toString() hur ett visst objekt skall presenteras vid utskrift på terminal– Denna metod är överskriven av flera av klasserna i Java

Page 41: Arv, polymorfi och gränssnitt

previous next 41

Klasser,arv, polymorfi, mm

Abstrakta metoder och klasser• En klass kan deklareras abstrakt

– Då kan inga instanser av klassen skapas

• En klass kan deklarera en eller flera av sina metoder som abstrakta– Då blir också klassen automatiskt abstrakt

• Inga instanser av klassen kan därför skapas

– En subklass blir också abstrakt till dess att alla abstrakta metoder fått en definition

• Tex om metoderna m1() och m2() deklarerats abstrakta i klassen A men subklassen B endast implementerar m1() så är B också abstraktOm en klass C deklareras som subklass till B och implementerar m2() så blir C konkret och kan instansieras

Page 42: Arv, polymorfi och gränssnitt

previous next 42

Klasser,arv, polymorfi, mm

Exempel: abstrakt klass

abstract class GraphicObject{int x, y;

...void moveTo(int newX, int newY)

{...}abstract void draw();

}

class Circle extends GraphicObject

{void draw() {...}

}

class Rectangle extends GraphicObject{

void draw() {...}}

Page 43: Arv, polymorfi och gränssnitt

previous next 43

Klasser,arv, polymorfi, mm

Exempel: abstrakt klasspublic abstract class Shape {

public abstract double area();public abstract double circumference();

}

class Circle extends Shape { proteected double r; protected static final

double PI = 3.14; public Circle()

{this(1.0);} public Circle(double r)

{this.r = r;} public double area(

{return PI * r * r;} public double circumference ()

{return 2 * PI * r;}}

class Rectangle extends Shape { proteected double w, h; public Rectangle (){this(0.0, 0.0);} public Rectangle (double w, double h)

{this.w = w; this.h = h;}

public double area() {return w * h;}

public double circumference() {return 2 * (w + h);}

}

Page 44: Arv, polymorfi och gränssnitt

previous next 44

Klasser,arv, polymorfi, mm

Vektorer• Deklareras på följande sätt

Typ[] vektor;

• Instansiering (tex)vektor = new Typ[10]

• Kan skapas från primitiva typerint[] tal = new int[5];tal[0] = 2000;Sytem.out.println(tal[0]);

• Kan skapas mer direktPoint[] punkter = {new Point(2, 3),

new Point(56,72)}

Page 45: Arv, polymorfi och gränssnitt

previous next 45

Klasser,arv, polymorfi, mm

...• Så kan vi skapa en vektor av Shapes

Shape[] shapes = new Shape[3];shapes[0] = new Circle(2.0);shapes[1] = new Rectangle(1.0, 2.0);shapes[2] = new Rectangle(10.0, 20.0);

double totalArea = 0;for(int i = 0; i < shapes.length; i++)

total_area += shapes[i].area();

Page 46: Arv, polymorfi och gränssnitt

previous next 46

Klasser,arv, polymorfi, mm

Interface• Ett interface är som en abstrakt klass med enbart abstrakta metoder och

konstanterpublic interface InterfaceX {

public ReturTyp1 m1(X x);public ReturTyp2 m2(Y y);

}• En klass kan deklarera att den implementerar ett eller flera interface

– Observera att en klass endast är direkt subklass till en klass men att den kan implementera flera interfaceclass MinFigur extends Figur implements Interface1,

Interface2 {...}

• Ett interface kan utvidga ett eller flera andra interfacepublic interface InterfaceN extends Interface1,

Interface2,Interface3

{...}

Page 47: Arv, polymorfi och gränssnitt

previous next 47

Klasser,arv, polymorfi, mm

Exempel: interface

public interface Sleeper { public void wakeUp();

public long ONE_SECOND = 1000; public long ONE_MINUTE = 60000;}

public class GUIClock extends Applet implements Sleeper {

. . . public void wakeUp() { repaint(); clock.letMeSleepFor(this, ONE_MINUTE); }}

Konstanter nås viaInterfacenamn.konstant

tex Sleeper.One_Second

Page 48: Arv, polymorfi och gränssnitt

previous next 48

Klasser,arv, polymorfi, mm

..med interface med följande definitioner...

public interface Drawable{public void setColor(Color c);public void setPosition(Point p);public void draw(Window dw);

}

public DrawableRectangle extends Rectangle implements Drawable{

private Color c;private Point pos;public void setColor(Color c)

{this.c = c};public void setPosition(Point p)

{pos = p;}public void draw(Window dw)

{dw.drawRect(pos.x, pos.y, height, width);}}

Rectangle

Page 49: Arv, polymorfi och gränssnitt

previous next 49

Klasser,arv, polymorfi, mm

... så kan vi konstruera en vektor av interface

Drawable[] drawables = new Drawable[3];drawables[0] = new DrawableCircle(2.0);drawables[1] = new DrawableSquare(20.0);drawables[2] = new DrawableRectangle(10.0, 20.0);

for(int i = 0; i < drawables.length; i++){drawables[i].setPosition(i * 10.0, i * 5.0);drawables[i].draw(myWindow);

}

(Givet att vi också konstruerat enDrawableCircle och en DrawableSquare på motsvarande sätt)