/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
Metoder kan ikke ses i andre klasser ??
Fra : Simon...


Dato : 19-10-02 20:37

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







 
 
Ole Ildsgaard Hougaa~ (19-10-2002)
Kommentar
Fra : Ole Ildsgaard Hougaa~


Dato : 19-10-02 21:33

"Simon..." <devnull@linux.org> wrote:

>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 ??

Det er hverken 'abstract' eller dybden af dit hierarki der gør det. Se
nedenfor.

>Figur (øverst)
> |
>V
>Punkt
> |
>V
>Streg
> |
>V
>Trekant
> |
>V
>Firkant (nederst)

Det er ikke et veldesignet hierarki. Normalt siger man at nedarvning
repræsenterer "... er en ...". For eksempel "En trekant er en figur".
Du har "En firkant er en trekant er en streg er et punkt." Det er det
jo ikke rigtigt.

<klip: meget kode>

>koden for de forskellige af disse ser sådan her ud:
> public int doPaint(DrawArea dA)
> {
>
> if (!getDrawed())
> {
> if (getSlags() == "Punkt")
> {
> dA.setPunkt1(getX1(),getY1());
> dA.setOperator(1);
> }

<osv.>

> setDrawed(true);
> }
> return 0;
> }

Det virker ikke. Du kan ikke sammenligne Strings med ==. Brug equals.
For eksempel getSlags().equals("Punkt").

> 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();
> }
>
> }
>}

Sagen er at selv om du ved at temp i virkeligheden er en firkant, så
gør Java-compileren det ikke (og har i øvrigt ingen reel mulighed for
at finde ud af det). Såvidt Java-compileren ved står den med en
vilkårlig Figur. Du bliver nødt til at fortælle compileren at den
faktisk står med en Firkant. Det gør man med et såkaldt down-cast, der
ser sådan ud: (Firkant)temp. Din linie ovenfor kommer så til sådan ud:

int df = ((Firkant)temp).getX4();

Håber det hjalp.
--
Ole I. Hougaard
oih@get2net.dk

Simon... (19-10-2002)
Kommentar
Fra : Simon...


Dato : 19-10-02 23:45


> int df = ((Firkant)temp).getX4();
>
> Håber det hjalp.

den linie der hjalp meget, havde jeg slet ikke tænkt over...
tak

mvh.Simon



Bertel Lund Hansen (20-10-2002)
Kommentar
Fra : Bertel Lund Hansen


Dato : 20-10-02 09:27

Simon... skrev:

>den linie der hjalp meget, havde jeg slet ikke tænkt over...

Tænk også over det her - selv om du evt. har fået dit program til
at virke:

>Det er ikke et veldesignet hierarki. Normalt siger man at nedarvning
>repræsenterer "... er en ...". For eksempel "En trekant er en figur".
>Du har "En firkant er en trekant er en streg er et punkt." Det er det
>jo ikke rigtigt.

--
Bertel
http://bertel.lundhansen.dk/   FIDUSO: http://fiduso.dk/

Simon... (20-10-2002)
Kommentar
Fra : Simon...


Dato : 20-10-02 09:51


> >Det er ikke et veldesignet hierarki. Normalt siger man at nedarvning
> >repræsenterer "... er en ...". For eksempel "En trekant er en figur".
> >Du har "En firkant er en trekant er en streg er et punkt." Det er det
> >jo ikke rigtigt.

ja det gjorde jeg skam, jeg havde designet det med figur øverst som abstract
og så fire underklasser på samme niveau, men min lære ville gerne have det
på den
måde der... dont ask me why... det var vel for øvelsens skyld...

mvh.Simon



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408925
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste