(9 maj 2014 Klasshierarkier 1 ) Exempel på användning av arv: Geometriska figurer Uppgift: Skriv ett program som kan hantera några olika geometrisk figurer: linjer, cirklar och rektanglar.
(9 maj 2014 Klasshierarkier 1 ) Exempel på användning av arv: Geometriska figurer Uppgift: Skriv ett program som kan hantera några olika geometrisk figurer: linjer, cirklar och rektanglar. Programmet ska kunna
(9 maj 2014 Klasshierarkier 1 ) Exempel på användning av arv: Geometriska figurer Uppgift: Skriv ett program som kan hantera några olika geometrisk figurer: linjer, cirklar och rektanglar. Programmet ska kunna 1. representera ett antal olika figurer,
(9 maj 2014 Klasshierarkier 1 ) Exempel på användning av arv: Geometriska figurer Uppgift: Skriv ett program som kan hantera några olika geometrisk figurer: linjer, cirklar och rektanglar. Programmet ska kunna 1. representera ett antal olika figurer, 2. rita upp en bild av de representerade figurerna,
(9 maj 2014 Klasshierarkier 1 ) Exempel på användning av arv: Geometriska figurer Uppgift: Skriv ett program som kan hantera några olika geometrisk figurer: linjer, cirklar och rektanglar. Programmet ska kunna 1. representera ett antal olika figurer, 2. rita upp en bild av de representerade figurerna, 3. beräkna den sammanlagda ytan av figurerna och
(9 maj 2014 Klasshierarkier 1 ) Exempel på användning av arv: Geometriska figurer Uppgift: Skriv ett program som kan hantera några olika geometrisk figurer: linjer, cirklar och rektanglar. Programmet ska kunna 1. representera ett antal olika figurer, 2. rita upp en bild av de representerade figurerna, 3. beräkna den sammanlagda ytan av figurerna och 4. kunna läsa in hur en fil med figurer.
(9 maj 2014 Klasshierarkier 1 ) Exempel på användning av arv: Geometriska figurer Uppgift: Skriv ett program som kan hantera några olika geometrisk figurer: linjer, cirklar och rektanglar. Programmet ska kunna 1. representera ett antal olika figurer, 2. rita upp en bild av de representerade figurerna, 3. beräkna den sammanlagda ytan av figurerna och 4. kunna läsa in hur en fil med figurer. En rad andra operationer är naturligtvis tänkbara: flytta, rotera, skala...
(9 maj 2014 Klasshierarkier 1 ) Exempel på användning av arv: Geometriska figurer Uppgift: Skriv ett program som kan hantera några olika geometrisk figurer: linjer, cirklar och rektanglar. Programmet ska kunna 1. representera ett antal olika figurer, 2. rita upp en bild av de representerade figurerna, 3. beräkna den sammanlagda ytan av figurerna och 4. kunna läsa in hur en fil med figurer. En rad andra operationer är naturligtvis tänkbara: flytta, rotera, skala... Koden skall utformas så att det är lätt att lägga det krävs minimala ändringar i existerande kod för att lägga till nya figurer.
(9 maj 2014 Klasshierarkier 2 ) Exempel på ett ritat fönster med figurer Indatafil: 600 600 rectangle 20 50 200 30 circle 350 100 30 rectangle 300 200 50 150 circle 100 300 80 line 0 0 600 300 line 300 30 50 450
(9 maj 2014 Klasshierarkier 3 ) Geometriska figurer forts Gemensamt för de olika figurerna:
(9 maj 2014 Klasshierarkier 3 ) Geometriska figurer forts Gemensamt för de olika figurerna: Alla har en position i planet dvs en x- och en y-koordinat (även om exakt vad positionen betyder varierar)
(9 maj 2014 Klasshierarkier 3 ) Geometriska figurer forts Gemensamt för de olika figurerna: Alla har en position i planet dvs en x- och en y-koordinat (även om exakt vad positionen betyder varierar) Alla har en färg. Linjer svarta, cirklar röda, rektanglar blåa tycks det.
(9 maj 2014 Klasshierarkier 3 ) Geometriska figurer forts Gemensamt för de olika figurerna: Alla har en position i planet dvs en x- och en y-koordinat (även om exakt vad positionen betyder varierar) Alla har en färg. Linjer svarta, cirklar röda, rektanglar blåa tycks det. Egenheter för de olika figurerna:
(9 maj 2014 Klasshierarkier 3 ) Geometriska figurer forts Gemensamt för de olika figurerna: Alla har en position i planet dvs en x- och en y-koordinat (även om exakt vad positionen betyder varierar) Alla har en färg. Linjer svarta, cirklar röda, rektanglar blåa tycks det. Egenheter för de olika figurerna: Linjer har en andra ändpunkt.
(9 maj 2014 Klasshierarkier 3 ) Geometriska figurer forts Gemensamt för de olika figurerna: Alla har en position i planet dvs en x- och en y-koordinat (även om exakt vad positionen betyder varierar) Alla har en färg. Linjer svarta, cirklar röda, rektanglar blåa tycks det. Egenheter för de olika figurerna: Linjer har en andra ändpunkt. Cirklar har en radie.
(9 maj 2014 Klasshierarkier 3 ) Geometriska figurer forts Gemensamt för de olika figurerna: Alla har en position i planet dvs en x- och en y-koordinat (även om exakt vad positionen betyder varierar) Alla har en färg. Linjer svarta, cirklar röda, rektanglar blåa tycks det. Egenheter för de olika figurerna: Linjer har en andra ändpunkt. Cirklar har en radie. Rektanglar har en bredd och höjd.
(9 maj 2014 Klasshierarkier 4 ) Geometriska figurer forts 1. Behöver således klasserna: Line, Circle och Rectangle
(9 maj 2014 Klasshierarkier 4 ) Geometriska figurer forts 1. Behöver således klasserna: Line, Circle och Rectangle 2. Eftersom klasserna har vissa gemensamma egenskaper (position och färg) gör vi en gemensam basklass kallad Shape
(9 maj 2014 Klasshierarkier 4 ) Geometriska figurer forts 1. Behöver således klasserna: Line, Circle och Rectangle 2. Eftersom klasserna har vissa gemensamma egenskaper (position och färg) gör vi en gemensam basklass kallad Shape 3. Eftersom figurerna alla är subklasser till Shape kan vi lagra dem i en samma struktur, t ex ArrayList<Shape> theshapes
(9 maj 2014 Klasshierarkier 5 ) Geometriska figurer forts Vi får följande klasshierarki: Shape x : int y : int color : Color Line x1 : int x2 : int Circle radius : int Rectangle width : int height : int
(9 maj 2014 Klasshierarkier 6 ) Geometriska figurer: Klassen Shape första utkast public class Shape { protected int x; protected int y; protected Color color; public Shape(int x, int y, Color color) { this.x = x; this.y = y; this.color = color; public Shape(int x, int y) { this(x, y, Color.BLACK); // Default color
(9 maj 2014 Klasshierarkier 6 ) Geometriska figurer: Klassen Shape första utkast public class Shape { protected int x; protected int y; protected Color color; public Shape(int x, int y, Color color) { this.x = x; this.y = y; this.color = color; public Shape(int x, int y) { this(x, y, Color.BLACK); Kommer vi någonsin göra new Shape? // Default color
(9 maj 2014 Klasshierarkier 6 ) Geometriska figurer: Klassen Shape första utkast public class Shape { protected int x; protected int y; protected Color color; public Shape(int x, int y, Color color) { this.x = x; this.y = y; this.color = color; public Shape(int x, int y) { this(x, y, Color.BLACK); Kommer vi någonsin göra new Shape? // Default color Varför behövs då en konstruktor?
Geometriska figurer: Klassen Line första utkast public class Line extends Shape { protected int x1; protected int y1; public Line(int x, int y, int x1, int y1) { super(x, y); // Default color this.x1 = x1; this.y1 = y1; public double area() { return 0; public void paint(graphics g) { g.setcolor(color) g.drawline(x, y, x1, y1); (9 maj 2014 Klasshierarkier 7 )
Geometriska figurer: Klassen Circle första utkast public class Circle extends Shape { protected int radius; public Circle(int x, int y, int radius){ super(x, y, Color.RED); this.radius = radius; public double area(){ return Math.PI*radius*radius; public void paint(graphics g){ g.setcolor(color); g.filloval(x - radius, y - radius, 2*radius, 2*radius); (9 maj 2014 Klasshierarkier 8 )
Geometriska figurer: Klassen Rectangle första utkast public class Rectangle extends Shape { protected int width; protected int height; public Rectangle(int x, int y, int width, int height) { super(x,y, Color.BLUE); this.width = width; this.height = height; public double area(){ return width*height; public void paint(graphics g){ g.setcolor(color); g.fillrect(x, y, width, height); (9 maj 2014 Klasshierarkier 9 )
(9 maj 2014 Klasshierarkier 10 ) Geometriska figurer: Klassen Drawing För att representera en mängd figurer skapar vi klassen Drawing. Eftersom den skall kunna ritas ut gör vi den som en subklass till JPanel: public class Drawing extends JPanel { private ArrayList<Shape> shapes; private int width; private int height; public Drawing(???) {???
(9 maj 2014 Klasshierarkier 11 ) Geometriska figurer: Klassen Drawing forts public double area() { double a = 0; for (Shape s:shapes) { a += s.area(); return a; public void paintcomponent(graphics g) { super.paintcomponent(g); for (Shape s:shapes) { s.paint(g); Problem: Varken area eller paintcomponent kommer att kompilera. Varför?
(9 maj 2014 Klasshierarkier 11 ) Geometriska figurer: Klassen Drawing forts public double area() { double a = 0; for (Shape s:shapes) { a += s.area(); return a; public void paintcomponent(graphics g) { super.paintcomponent(g); for (Shape s:shapes) { s.paint(g); Problem: Varken area eller paintcomponent kommer att kompilera. Varför? I for-satsen är s en Shape men Shape har varken area eller paint.
(9 maj 2014 Klasshierarkier 11 ) Geometriska figurer: Klassen Drawing forts public double area() { double a = 0; for (Shape s:shapes) { a += s.area(); return a; public void paintcomponent(graphics g) { super.paintcomponent(g); for (Shape s:shapes) { s.paint(g); Problem: Varken area eller paintcomponent kommer att kompilera. Varför? I for-satsen är s en Shape men Shape har varken area eller paint. Lösning: Definiera dessa metoder i Shape
(9 maj 2014 Klasshierarkier 12 ) Geometriska figurer: Klassen Shape komplettering Metoden area är enkel men vad gör vi med paint? public class Shape {... public Shape(int x, int y, Color color) {... public Shape(int x, int y) {... public double area() { return 0; public void paint(graphics g) {???
(9 maj 2014 Klasshierarkier 12 ) Geometriska figurer: Klassen Shape komplettering Metoden area är enkel men vad gör vi med paint? public class Shape {... public Shape(int x, int y, Color color) {... public Shape(int x, int y) {... public double area() { return 0; public void paint(graphics g) {??? Spelar det någon roll vad vi gör?
(9 maj 2014 Klasshierarkier 13 ) Geometriska figurer: Klassen Shape snyggare lösning public abstract class Shape {... public double area() { return 0; // Note: abstract public abstract void paint(graphics g); // Note: abstract
(9 maj 2014 Klasshierarkier 13 ) Geometriska figurer: Klassen Shape snyggare lösning public abstract class Shape {... public double area() { return 0; // Note: abstract public abstract void paint(graphics g); // Note: abstract Fördelar:
(9 maj 2014 Klasshierarkier 13 ) Geometriska figurer: Klassen Shape snyggare lösning public abstract class Shape {... public double area() { return 0; // Note: abstract public abstract void paint(graphics g); // Note: abstract Fördelar: Metoderna area och paintcomponent i Drawing fungerar
(9 maj 2014 Klasshierarkier 13 ) Geometriska figurer: Klassen Shape snyggare lösning public abstract class Shape {... public double area() { return 0; // Note: abstract public abstract void paint(graphics g); // Note: abstract Fördelar: Metoderna area och paintcomponent i Drawing fungerar Förhindrar att objekt av typen Shape skapas
(9 maj 2014 Klasshierarkier 13 ) Geometriska figurer: Klassen Shape snyggare lösning public abstract class Shape {... public double area() { return 0; // Note: abstract public abstract void paint(graphics g); // Note: abstract Fördelar: Metoderna area och paintcomponent i Drawing fungerar Förhindrar att objekt av typen Shape skapas Förhindrar att vi glömmer att skriva paintcomponent
(9 maj 2014 Klasshierarkier 13 ) Geometriska figurer: Klassen Shape snyggare lösning public abstract class Shape {... public double area() { return 0; // Note: abstract public abstract void paint(graphics g); // Note: abstract Fördelar: Metoderna area och paintcomponent i Drawing fungerar Förhindrar att objekt av typen Shape skapas Förhindrar att vi glömmer att skriva paintcomponent Får en default-metod för arean som fungerar på linjer och eventuella kommande objekt som punkt och text.
(9 maj 2014 Klasshierarkier 14 ) Geometriska figurer: Klassen Drawing igen Hur skapar vi ett Drawing-objekt public class Drawing extends JPanel { private ArrayList<Shape> shapes; private int width; private int height; public Drawing(???) {??? Ritningen skulle läsas in från en fil. Vi låter konstruktorn göra det.
(9 maj 2014 Klasshierarkier 15 ) Geometriska figurer: Klassen Drawing igen Första raden i filen innehåller fönsterstorleken public Drawing(Scanner scan) { this.width = scan.nextint(); this.height = scan.nextint(); this.shapes = new ArrayList<Shape>(); this.read(scan); this.setpreferredsize(new Dimension(this.width, this.height)); this.setbackground(color.white);
(9 maj 2014 Klasshierarkier 16 ) Geometriska figurer: Klassen Drawing igen private void read(scanner sc) { while (sc.hasnext()){ String shape=sc.next(); if (shape.equals("circle")){ shapes.add(circle.read(sc)); else if (shape.equals("rectangle")) { shapes.add(rectangle.read(sc)); else if (shape.equals("line")) { shapes.add(line.read(sc)); else { throw new RuntimeException("Unknown shape: " + shape); De enskilda figurobjekten måste således förses med en klassmetod read.
(9 maj 2014 Klasshierarkier 17 ) Geometriska figurer: Klassen Line slutlig version public class Line extends Shape { protected int x1; protected int y1; public Line(int x, int y, int x1, int y1) {... public static Line read(scanner scan) { return new Line(scan.nextInt(), scan.nextint(), scan.nextint(), scan.nextint()); public void paint(graphics g) {... OBS: Ingen area-metod!
(9 maj 2014 Klasshierarkier 18 ) Geometriska figurer: read i Circle och Rectangle public static Circle read(scanner scan) { return new Circle(scan.nextInt(), scan.nextint(), scan.nextint()); public static Rectangle read(scanner scan) { return new Rectangle(scan.nextInt(), scan.nextint(), scan.nextint(), scan.nextint());
(9 maj 2014 Klasshierarkier 18 ) Geometriska figurer: read i Circle och Rectangle public static Circle read(scanner scan) { return new Circle(scan.nextInt(), scan.nextint(), scan.nextint()); public static Rectangle read(scanner scan) { return new Rectangle(scan.nextInt(), scan.nextint(), scan.nextint(), scan.nextint()); Anmärkning: Förutsätter att parametrarna till metoder evakueras från vänster till höger vilket är fallaet i Java men inte i alla programmeringsspråk.
(9 maj 2014 Klasshierarkier 19 ) Geometriska figurer: Testklass public class DrawTest extends JFrame { public static void main(string[] args) throws IOException { String filename = "data.txt"; File input = new File(filename); Scanner fsc = new Scanner(input); Drawing d = new Drawing(fsc); System.out.println("Total area: " + (int)d.area()); new DrawTest(d); public DrawTest(Drawing d){ this.add(d); this.pack(); this.settitle("drawtest"); this.setdefaultcloseoperation(exit_on_close); this.setvisible(true);
(9 maj 2014 Klasshierarkier 20 ) Övningar Hämta filerna på http://www.it.uu.se/edu/course/homepage/prog2/vt14/talks/t13/shapes/code och lös följande uppgifter:
(9 maj 2014 Klasshierarkier 20 ) Övningar Hämta filerna på http://www.it.uu.se/edu/course/homepage/prog2/vt14/talks/t13/shapes/code och lös följande uppgifter: 1. Vilka ändringar behöver göras i koden för att lägga till en ny figur?
(9 maj 2014 Klasshierarkier 20 ) Övningar Hämta filerna på http://www.it.uu.se/edu/course/homepage/prog2/vt14/talks/t13/shapes/code och lös följande uppgifter: 1. Vilka ändringar behöver göras i koden för att lägga till en ny figur? 2. Skriv en klass Text som en underklass till Shape som representerar en godtycklig textsträng. En rad i indatafilen som definierar en text: text x y text fram till radslut
(9 maj 2014 Klasshierarkier 20 ) Övningar Hämta filerna på http://www.it.uu.se/edu/course/homepage/prog2/vt14/talks/t13/shapes/code och lös följande uppgifter: 1. Vilka ändringar behöver göras i koden för att lägga till en ny figur? 2. Skriv en klass Text som en underklass till Shape som representerar en godtycklig textsträng. En rad i indatafilen som definierar en text: text x y text fram till radslut 3. Skriv en klass Point som en underklass till Circle. Punkter skall ha svart som standardfärg, ha ytan 0 men ritas som en cirkel med radien 5 för att synas. En punkt definieras av indataraden point x y
(9 maj 2014 Klasshierarkier 21 ) Övningar forts 4. Skriv en klass Square som representerar en kvadrat. Färgen skall vara halvgenomskinlig grön dvs skapas med new Color(0, 255, 0, 128).
(9 maj 2014 Klasshierarkier 21 ) Övningar forts 4. Skriv en klass Square som representerar en kvadrat. Färgen skall vara halvgenomskinlig grön dvs skapas med new Color(0, 255, 0, 128). Indatafil: 600 600 rectangle 20 50 200 30 rectangle 300 200 50 150 circle 100 300 80 line 0 0 600 300 line 300 30 50 450 point 400 20 point 430 70 point 470 130 point 500 230 point 530 430 text 50 550 Hej hopp i lingonskogen! circle 350 100 30 rectangle 10 250 100 10 square 400 400 150
(9 maj 2014 Klasshierarkier 22 ) Fler övningar 5. Skriv en klass Oval som representerar en oval. Var bör den komma in i hierarkin? Borde något ändras i den befintliga hierarkin? Antag att du inte vet hur ytan av en oval skall beräknas och att den inte behövs (just nu) (samt att inte har lust att leta upp formeln på nätet). Hur skall du då göra med area-metoden?
(9 maj 2014 Klasshierarkier 22 ) Fler övningar 5. Skriv en klass Oval som representerar en oval. Var bör den komma in i hierarkin? Borde något ändras i den befintliga hierarkin? Antag att du inte vet hur ytan av en oval skall beräknas och att den inte behövs (just nu) (samt att inte har lust att leta upp formeln på nätet). Hur skall du då göra med area-metoden? 6. Lägg till en setcolor(color c) som kan användas för att ändra färg på en figur. Var skall den placeras?
(9 maj 2014 Klasshierarkier 22 ) Fler övningar 5. Skriv en klass Oval som representerar en oval. Var bör den komma in i hierarkin? Borde något ändras i den befintliga hierarkin? Antag att du inte vet hur ytan av en oval skall beräknas och att den inte behövs (just nu) (samt att inte har lust att leta upp formeln på nätet). Hur skall du då göra med area-metoden? 6. Lägg till en setcolor(color c) som kan användas för att ändra färg på en figur. Var skall den placeras? 7. Antag att man vill förse varje individuell figur men en färg. Färgen skall ges i form av RGB-värden (3 heltal). Var på indata-raden skall dessa tre värden placeras och vem skall läsa dem?