Hej,
Jeg har lidt et problem mere, jeg har et arve hieraki (se nedenfor) og så
har jeg en hægtet liste, fra denne hægtede liste, kan jeg kun lave
metodekald på de metoder
der ligger øverst i arve hierakiet, i noget der kunne være en abstract
klasse.
Jeg ved godt man kan skrive "public abstract void metode();" og at den så
sender videre ned i hierakiet, men hvordan gør jeg når mit hieraki ser sådan
her ud,
og jeg ikke vil have alle pånær den sidste klasse som abstract ??
Figur (øverst)
|
V
Punkt
|
V
Streg
|
V
Trekant
|
V
Firkant (nederst)
koden for de forskellige af disse ser sådan her ud:
===========
(figur)
public class Figur
{
//Private variabler
private Figur next; //næste element på listen
private String slags; //figurens type
private boolean drawed; //Er figuren tegnet allerede ?
public Figur(String slags_p)
{
next = null;
slags = new String(slags_p);
drawed = false;
}
//snip en masse get ogo set metoder, disse kan jeg godt få fat i fra min
hægtede listes klasse
}
=================
(punkt)
public class Punkt extends Figur
{
//Private variabler
private int x1,y1;
//Constructoren der bliver kaldt "direkte" ved oprettelse af et punkt.
public Punkt(int x1_p, int y1_p)
{
super("Punkt");
x1 = x1_p;
y1 = y1_p;
}
//Constructoren der bliver brugt ved overførsel fra underliggende
klasser.
public Punkt(int x1_p, int y1_p, String slags_p)
{
super(slags_p);
x1 = x1_p;
y1 = y1_p;
}
//Metoder til at hente de 2 koordinater indeholdt i denne del
public int getX1()
{
return x1;
}
public int getY1()
{
return y1;
}
//toString for et punkt til udprint.
public String toString()
{
String report = new String("");
report += "Type: "+getSlags()+",\tKoordinater: ("+x1+","+y1+").";
return report;
}
}
============
(og så her er firkant klassen, de to andre forsætter deres udvidelser mod
firkant men ligner punkt, så jeg har kun vedlagt firkant)
public class Firkant extends Trekant
{
//Private variabler
private int x4,y4;
//I alle andre klasser end firkant der er (fordi den er nederst i arve
hierakiet)
//vil det være nødvendigt med 2 constructors, hvis man vil undgå at
skulle skrive
//typen af figuren med i argumenterne - grundet min opbygning af
hieraktiet,
//og at jeg insistere på at gemme "slags" i figur efter overvejelser om
anden opbygning.
//Da denne vil være mest sparsom for brugeren i sidste ende.
//Desuden vil programmet stadig økre rigtigt selvom brugeren skriver
figurens type tilsidst,
//da programmet så bare tolker det som en overførsel fra en figur
længere nede i hierakiet.
public Firkant(int x1_p, int y1_p, int x2_p, int y2_p, int x3_p, int
y3_p, int x4_p, int y4_p)
{
super(x1_p, y1_p, x2_p, y2_p, x3_p, y3_p, "Firkant");
x4 = x4_p;
y4 = y4_p;
}
public void test()
{
int a = getX1();
}
//Metoder til at hente de 2 koordinater indeholdt i denne del
public int getX4()
{
return x4;
}
public int getY4()
{
return y4;
}
public int doPaint(DrawArea dA)
{
if (!getDrawed())
{
if (getSlags() == "Punkt")
{
dA.setPunkt1(getX1(),getY1());
dA.setOperator(1);
}
else if(getSlags() == "Streg")
{
dA.setPunkt1(getX1(),getY1());
dA.setPunkt2(getX2(),getY2());
dA.setOperator(2);
}
else if(getSlags() == "Trekant")
{
dA.setPunkt1(getX1(),getY1());
dA.setPunkt2(getX2(),getY2());
dA.setPunkt3(getX3(),getY3());
dA.setOperator(3);
}
else if(getSlags() == "Firkant");
{
dA.setPunkt1(getX1(),getY1());
dA.setPunkt2(getX2(),getY2());
dA.setPunkt3(getX3(),getY3());
dA.setPunkt4(getX4(),getY4());
dA.setOperator(4);
}
setDrawed(true);
}
return 0;
}
//toString for en firkant til udprint.
public String toString()
{
String report = new String("");
report += "Type: "+getSlags()+",\tKoordinater:
("+getX1()+","+getY1()+"),";
report += "("+getX2()+","+getY2()+"),";
report += "("+getX3()+","+getY3()+"),";
report += "("+x4+","+y4+").";
return report;
}
}
===========
(den hægtede liste, hvis det ellers har nogen betydning hvordan den ser ud)
public class HList_Graphic
{
private Figur head;
public HList_Graphic()
{
head = null;
}
//metoden til at tilføje et element til listen.
public void doAdd(Figur new_p)
{
Figur temp;
//hvis new_p er første element sæt det da til at være head.
if(head == null)
head = new_p;
//Ellers søg fra head og videre til elementets næste (peger) er
null,
//og sæt derefter new_p ind der.
else
{
temp = head;
while(true)
{
if(temp.getNext() == null)
{
temp.setNext(new_p);
return;
}
else
temp = temp.getNext();
}
}
}
public void doKill()
{
head = null;
}
//Tegner listen.
public void print(DrawArea dA)
{
Figur temp = head;
temp.getSlags(); //Dette metodekald virker, men er også til en
metode i Figurklassen
while (temp != null)
{
int df = temp.getX4(); //Dette gør ikke og er en metode i
Firkant
Firkant a = new Firkant(1,2,1,1,1,1,1,1); //Dette virker også,
jeg skulle lige se om der var hul igennem overhovedet... det er der.. ???
temp = temp.getNext();
}
}
}
=========
hvad gør jeg så galt ?
er det fordi det er i et arve hieraki jeg ikke må kalde de underliggende
klassers metoder, og hvordan får jeg så adgang til dem (variablerne)???
- Man kunne måske lave metodekaldene i Figurklassen ?? ville det mon gå godt
? ville bare så gerne have delt det lidt ud.... :(
tak
mvh.Simon
|