Linux - Friheden til at programmere i Java: Version 0.7.20040516 - 2020-12-31 | ||
---|---|---|
forrige | Kapitel 12. Interfaces - grænseflader til objekter | næste |
Lad os udvide (arve fra) Terning til at implementere Tegnbar-interfacet. For at gøre koden kort har metoden tegn() en hjælpemetode ci(), der tegner en cirkel for et øje.
import java.awt.*; public class GrafiskTerning extends Terning implements Tegnbar { int x, y; public void sætPosition(int x, int y) { this.x = x; this.y = y; } private void ci(Graphics g, int i, int j) { g.fillOval(x+1+10*i,y+1+10*j,8,8); // Tegn fyldt cirkel } public void tegn(Graphics g) { int ø = værdi; g.drawRect(x,y,30,30); // Tegn kant if (ø==1) ci(g,1,1); // Tegn 1-6 øjne else if (ø==2) { ci(g,0,0); ci(g,2,2); } else if (ø==3) { ci(g,0,0); ci(g,1,1); ci(g,2,2); } else if (ø==4) { ci(g,0,0); ci(g,0,2); ci(g,2,0); ci(g,2,2); } else if (ø==5) { ci(g,0,0); ci(g,0,2); ci(g,1,1); ci(g,2,0); ci(g,2,2); } else { ci(g,0,0); ci(g,0,1); ci(g,0,2); ci(g,2,0); ci(g,2,1); ci(g,2,2); } } }
Bemærk:
Man kan godt have flere metoder end specificeret i interfacet (i dette tilfælde ci()).
GrafiskTerning er-en Tegnbar og samtidig en Terning. Der kan kun arves fra én klasse, men samtidigt kan der godt implementeres et interface (faktisk også flere).
Lad os gøre det samme med et raflebæger. For variationens skyld lader vi bægeret altid have den samme position, ved at lade sætPosition()'s krop være tom.
import java.awt.*;
public class GrafiskRaflebaeger extends Raflebaeger implements Tegnbar
{
public GrafiskRaflebaeger()
{
super(0);
}
public void sætPosition(int x, int y) { } // tom metodekrop
public void tegn(Graphics g)
{
g.drawOval(80,20,90,54);
g.drawLine(150,115,170,50);
g.drawLine(100,115,80,50);
g.drawArc(100,100,50,30,180,180);
}
}
Kunne vi have udeladt sætPosition()-metoden, der alligevel ikke gør noget? Nej, vi har lovet at implementere begge metoder, om det så blot er med en tom krop, idet vi skrev "implements Tegnbar".
En hvilken som helst klasse kan gøres til at være Tegnbar. Her er et tegnbart rektangel:
import java.awt.*; public class Rektangel extends Rectangle implements Tegnbar { public Rektangel(int x1, int y1, int width1, int height1) { super(y1,x1,width1,height1); } public void sætPosition(int x1, int y1) { x = x1; y = y1; } public void tegn(Graphics g) { g.drawRect(x,y,width,height); } }
Lad os nu lave en applet, der viser nogle tegnbare objekter:
import java.applet.*; import java.awt.*; import java.util.*; public class TegnbareObjekter extends Applet { Vector tegnbare = new Vector(); GrafiskRaflebaeger bæger = new GrafiskRaflebaeger(); public void paint(Graphics g) { super.paint(g); for (int n=0; n<tegnbare.size(); n++) { Tegnbar t = (Tegnbar) tegnbare.elementAt(n); t.tegn(g); } } public void sætPositioner() { for (int n=0; n<tegnbare.size(); n++) { Tegnbar t = (Tegnbar) tegnbare.elementAt(n); int x = (int) (Math.random()*200); int y = (int) (Math.random()*200); t.sætPosition(x,y); } } public void init() { Stjerne s = new Stjerne(); tegnbare.addElement(s); tegnbare.addElement( new Rektangel(10,10,30,30) ); tegnbare.addElement( new Rektangel(15,15,20,20) ); GrafiskTerning t; t = new GrafiskTerning(); bæger.tilføj(t); tegnbare.addElement(t); t = new GrafiskTerning(); bæger.tilføj(t); tegnbare.addElement(t); tegnbare.addElement(bæger); sætPositioner(); // mere kode her // ... } // flere metoder her // ... }
Programmet holder styr på objekterne i tegnbare-vektoren. Da stjerner, rektangler, terningerne og raflebægeret alle er Tegnbare kan de behandles ens hvad angår tegning og positionering.