Skrevet lør. d. 07. juni 2003 kl. 13:47:12| #1
hvis klassen ikke skal tages ibrug hvis din betingelse ikke er opfyldt så bør du placere if-en udenfor klassen. Eller vil du oprette et unødvendigt objekt :-)
Skrevet lør. d. 07. juni 2003 kl. 13:55:07| #2
Det kan laves på flere måder.
En af dem er:
lav en basis-klasse BREV
public class BREVFactory {
public static BREV getBREV(double v, double l, double b, double t, String d) {
if(...) {
return new STANDARD(v,l,b,t,d);
} else if(...) {
return new XXXX(v,l,b,t,d);
} else {
return new YYYY(v,l,b,t,d);
}
}
}
Og så erstat:
STANDARD brev = new STANDARD(...);
med:
BREV brev = BREVFactory.getBREV(...);
Skrevet lør. d. 07. juni 2003 kl. 13:55:49| #3
ok -så jeg skal altså placere den i en anden klasse? Men hvordan får jeg så programmet til at gå til denne klasse hvis betingelserne er opfyldt?
Skrevet lør. d. 07. juni 2003 kl. 13:55:59| #4
Men den er måske lidt svær at gennemskue.
Og for at den virker godt skal al fælles funktionalitet også
flyttes til BREV.
Skrevet lør. d. 07. juni 2003 kl. 13:57:43| #5
ja..den er lidt svær at gennemskue...men jeg kan lige prøve at se, om jeg kan finde ud af at flytte alt det fælles til klassen brev
Skrevet lør. d. 07. juni 2003 kl. 13:59:37| #6
Hvis du vil have en simplere løsning tilføjer du bare en metode
til din eksisternde STANDARD klasse:
public static boolean isCorectType(double v, double l, double b) {
if(...) {
return true;
} else {
return false;
}
}
og bruger:
if(STANDARD.isCorrectType(v,l,b)) {
STANDARD brev = new STANDARD(v,l,b,t,d);
...
} else if(XXXX.isCorrectType(v,l,b)) {
XXXX brev = new XXXX(v,l,b,t,d);
...
} else {
YYYY brev = new YYYY(v,l,b,t,d);
...
}
Skrevet lør. d. 07. juni 2003 kl. 14:01:39| #7
Mit første forslag om en factory løsning er nok den bedste.
Men du slipper sikkert ikke for nogle abstrakte metoder i
basis klassen.
Skrevet lør. d. 07. juni 2003 kl. 14:05:18| #8
nej -det har du ret i...vil bare gerne være færdig meget snart, men jeg slipper nok ikke udenom at lave en ekstra klasse...er bare lidt bange for at det hele så pludselig ikke virker..
Skrevet lør. d. 07. juni 2003 kl. 14:12:32| #9
er det sådan jeg skal gøre det?
public static boolean isCorectType(double v, double l, double b) {
if(længde <= 23) {
return true;
} else {
return false;
}
}
public static boolean isCorectType(double v, double l, double b) {
if(bredde <= 17) {
return true;
} else {
return false;
}
}
public static boolean isCorectType(double v, double l, double b) {
if(tykkelse <= 0.5) {
return true;
} else {
return false;
}
}
if(STANDARD.isCorrectType(v,l,b)) {
STANDARD brev = new STANDARD(v,l,b,t,d);
...
} else if(STOR.isCorrectType(v,l,b)) {
STOR brev = new STOR(v,l,b,t,d);
...
} else {
MAXI brev = new MAXI(v,l,b,t,d);
...
}
Skrevet lør. d. 07. juni 2003 kl. 14:26:47| #10
De 3 metoder skal være i hver sin klasse.
Og jeg er ikke sikker på at reglerne er rigtige:
Eksempel:
public class STANDARD {
...
public static boolean isCorectType(double længde, double bredde, double tykkelse) {
if((længde <= 23) && (bredde <= 17) && (tykkelse < 0.5)) {
return true;
} else {
return false;
}
}
...
}
Skrevet lør. d. 07. juni 2003 kl. 14:27:22| #11
public class STANDARD {
...
public static boolean isCorectType(double længde, double bredde, double tykkelse) {
if((længde <= 23) && (bredde <= 17) && (tykkelse <= 0.5)) {
return true;
} else {
return false;
}
}
...
}
Skrevet lør. d. 07. juni 2003 kl. 14:51:45| #12
Skrevet lør. d. 07. juni 2003 kl. 14:54:39| #13
STOR og MAXI klasserne skal så også have deres metoder
med de rigtige regler.
Skrevet lør. d. 07. juni 2003 kl. 14:58:02| #14
Skrevet lør. d. 07. juni 2003 kl. 14:58:53| #15
men nu virker de ikke efter jeg har gjort det...ved ikke om du kan se fejlen...jeg synes ikke jeg kan se den..kan lige oprette et nyt spørgsmål
Skrevet lør. d. 07. juni 2003 kl. 15:01:24| #16
Nej - ikke nødvendigt - bare stil det her.
Skrevet lør. d. 07. juni 2003 kl. 15:02:37| #17
Men vi skal nok lige se koden som den ser ud nu.
Skrevet lør. d. 07. juni 2003 kl. 18:18:57| #18
havde slet ikke set at du havde skrevet herinde...så jeg oprettede alligevel et nyt spørgsmål, men pyt med det
Skrevet lør. d. 07. juni 2003 kl. 18:47:11| #19
Du fik jo hjælp af repsak, så helt fint.
Skrevet lør. d. 07. juni 2003 kl. 19:06:34| #20
men må jeg spørge dig om noget mere, Arne? (Du er jo efterhånden rimelig meget inde i min opgave) -skal nok lige oprette et nyt spørgsmål
Skrevet lør. d. 07. juni 2003 kl. 19:12:23| #21
Du må gerne spørge - og du behøver ikke at oprette et nyt spørgsmål
(jeg har fået point flere gange).
Skrevet lør. d. 07. juni 2003 kl. 19:13:37| #22
du har jo også hjulpet mig meget, så jeg vil gerne give dig points...men jeg skal lige finde ud af, hvad det helt konkret er jeg skal spørge om -skriver lige om 2 minutter
Skrevet lør. d. 07. juni 2003 kl. 19:19:21| #23
når jeg compiler mine 4 klasser, får jeg fejlmeldingen:
"invalid method declaration;return type required"
Kan endnu engang ikke finde ud af, hvad der går galt...men ved ikke om det er nemmest at jeg paster dem ind her -eller er det nemmere at jeg sender dem til dig?
Skrevet lør. d. 07. juni 2003 kl. 19:23:49| #24
Det lyder som en:
public xxxx() {
som kun er lovlig hvis xxxx er constructor ellers skal det være:
public void xxxx() {
public int xxxx() {
etc.etc.
Skrevet lør. d. 07. juni 2003 kl. 19:24:08| #25
Har du lige tilføjet metoder eller omdøbt klasser ?
Skrevet lør. d. 07. juni 2003 kl. 19:26:31| #26
jeg har rykket nogle af metoderne op i basisklassen "brev"
Skrevet lør. d. 07. juni 2003 kl. 19:26:52| #27
/**
* Write a description of class BREV here.
*
* @author anders
* @version 10.06.03
*/
public class BREV {
// instance variables - replace the example below with your own
private double længde;
private double bredde;
private double tykkelse;
private double vægt;
private String destination;
/**
* Constructor for objects of class BREV
*/
public STANDARD(double v, double l, double b, double t, String d) {
vægt = v;
destination = d;
længde = l;
bredde = b;
tykkelse = t;
}
/**
* An example of a method - replace this comment with your own
*
* @param y a sample parameter for a method
* @return the sum of x and y
*/
public double getLængde() {
return længde;
}
public void setLængde(double l) {
længde = l;
}
public double getBredde() {
return bredde;
}
public void setBredde(double b) {
bredde = b;
}
public double getTykkelse() {
return tykkelse;
}
public void setTykkelse(double t) {
tykkelse = t;
}
public double getVægt() {
return vægt;
}
public void setVægt(double v) {
vægt = v;
}
public String getDestination() {
return destination;
}
public void setDestination(String d) {
destination = d;
}
public String toString() {
double længde = 0; // <-----
if (længde <= 23)
{
brev = standard;
}
if(STANDARD.isCorrectType(v,l,b)) {
STANDARD brev = new STANDARD(v,l,b,t,d);
} else if(STOR.isCorrectType(v,l,b)) {
STOR brev = new STOR(v,l,b,t,d);
} else {
MAXI brev = new MAXI(v,l,b,t,d);
}
return " Vægt: " + vægt + " Porto: " + porto;
}
}
Skrevet lør. d. 07. juni 2003 kl. 19:29:10| #28
public class BREV {
public STANDARD(double v, double l, double b, double t, String d) {
constructoren skal hedde BREV !
Skrevet lør. d. 07. juni 2003 kl. 19:30:02| #29
Vær opmærksom på at constructore ikke arves d.v.s. at du i STANDARD
skal have en:
public STANDARD(double v, double l, double b, double t, String d) {
super(v,l,b,t,d);
}
Skrevet lør. d. 07. juni 2003 kl. 19:32:09| #30
ok -det vidste jeg ikke..
Skrevet lør. d. 07. juni 2003 kl. 19:33:45| #31
Skrevet lør. d. 07. juni 2003 kl. 19:36:26| #32
Hvis klasse B arver fra klasse A og så kan B referere til A som
"super" ligesom den kan referere til sig selv som "this".
Det ovenfor betyder bare at STANDARD's constructor kalde BREV's
consuctor med de samme argumenter.
Skrevet lør. d. 07. juni 2003 kl. 19:36:45| #33
og vil det sige at basisklassen ikke skal have nogen constructor overhovedet?
Skrevet lør. d. 07. juni 2003 kl. 20:12:14| #34
Jo.
Basis klassen skal have en constructor som gør noget.
De afledte klasser skal have en constructor som kalder
basis klassens constructor (og eventuelt gør noget mere - men
det behøver du ikke).
Skrevet lør. d. 07. juni 2003 kl. 20:15:49| #35
hmmm...tror sgu snart jeg bliver nødt t at give op...tror det bliver lidt for indviklet til mit niveau:(
Skrevet lør. d. 07. juni 2003 kl. 20:18:52| #36
Det er ikke så svært:
public class BREV {
// instance variables - replace the example below with your own
private double længde;
private double bredde;
private double tykkelse;
private double vægt;
private String destination;
/**
* Constructor for objects of class BREV
*/
public BREV(double v, double l, double b, double t, String d) {
vægt = v;
destination = d;
længde = l;
bredde = b;
tykkelse = t;
}
...
public class STANDARD extends BREV {
public STANDARD(double v, double l, double b, double t, String d) {
super(v,l,b,t,d);
}
...
Skrevet lør. d. 07. juni 2003 kl. 20:30:34| #37
men så skriver den stadig "cannot resolve symbol variable v"
Skrevet lør. d. 07. juni 2003 kl. 20:31:23| #38
altså i følgende stykke:
if(STANDARD.isCorrectType(v,l,b)) {
STANDARD brev = new STANDARD(v,l,b,t,d);
} else if(STOR.isCorrectType(v,l,b)) {
STOR brev = new STOR(v,l,b,t,d);
} else {
MAXI brev = new MAXI(v,l,b,t,d);
}
Skrevet lør. d. 07. juni 2003 kl. 20:33:06| #39
Det stykke skal ikke være i hverken BREV eler STANDARD.
Det skal være i det kode som skal bruge et brev. Dit hoved-program
eller lignende.
Skrevet lør. d. 07. juni 2003 kl. 20:33:55| #40
aaahhh...så det skal jeg bruge i den class jeg har kaldt for "main"?
Skrevet lør. d. 07. juni 2003 kl. 21:17:06| #41
Ja.
Logikken er den at du undersøger hvilken type brev det er og så
creater du et brev af den type.
Skrevet søn. d. 08. juni 2003 kl. 12:25:25| #42
har lige et spørgsmål mere, og da det stadig omhandler denne opgave, stiller jeg lige spørgsmålet herinde...skal nok oprette et nyt spørgsmål med points.
Skrevet søn. d. 08. juni 2003 kl. 12:27:52| #43
når jeg compiler får jeg i alle mine classes fejlmeldingen:
"return outside method" ved følgende sætning:
{
return " Vægt: " + vægt + " Porto: " + porto;
}
Skrevet søn. d. 08. juni 2003 kl. 12:29:03| #44
det er jo nok længere oppe det går galt, men jeg kan ikke finde ud af, hvor...
/**
* Write a description of class BREV here.
*
* @author anders
* @version 10.06.03
*/
public class BREV {
// instance variables - replace the example below with your own
private double længde;
private double bredde;
private double tykkelse;
private double vægt;
private String destination;
/**
* Constructor for objects of class BREV
*/
public BREV(double v, double l, double b, double t, String d) {
vægt = v;
destination = d;
længde = l;
bredde = b;
tykkelse = t;
}
/**
* An example of a method - replace this comment with your own
*
* @param y a sample parameter for a method
* @return the sum of x and y
*/
public double getLængde() {
return længde;
}
public void setLængde(double l) {
længde = l;
}
public double getBredde() {
return bredde;
}
public void setBredde(double b) {
bredde = b;
}
public double getTykkelse() {
return tykkelse;
}
public void setTykkelse(double t) {
tykkelse = t;
}
public double getVægt() {
return vægt;
}
public void setVægt(double v) {
vægt = v;
}
public String getDestination() {
return destination;
}
public void setDestination(String d) {
destination = d;
}
{
return " Vægt: " + vægt + " Porto: " + porto;
}
}
Skrevet søn. d. 08. juni 2003 kl. 13:01:03| #45
Der er faldet en:
publi String toString()
ud af din kode !
Skrevet søn. d. 08. juni 2003 kl. 13:01:36| #46
public String toString(){
return " Vægt: " + vægt + " Porto: " + porto;
}
Skrevet søn. d. 08. juni 2003 kl. 13:09:10| #47
men når jeg så skriver det, får jeg fejlmeldingen "illegal start of expression"...
Skrevet søn. d. 08. juni 2003 kl. 14:34:33| #48
package test;
/**
* Write a description of class BREV here.
*
* @author anders
* @version 10.06.03
*/
public class BREV {
// instance variables - replace the example below with your own
private double længde;
private double bredde;
private double tykkelse;
private double vægt;
private String destination;
/**
* Constructor for objects of class BREV
*/
public BREV(double v, double l, double b, double t, String d) {
vægt = v;
destination = d;
længde = l;
bredde = b;
tykkelse = t;
}
/**
* An example of a method - replace this comment with your own
*
* @param y a sample parameter for a method
* @return the sum of x and y
*/
public double getLængde() {
return længde;
}
public void setLængde(double l) {
længde = l;
}
public double getBredde() {
return bredde;
}
public void setBredde(double b) {
bredde = b;
}
public double getTykkelse() {
return tykkelse;
}
public void setTykkelse(double t) {
tykkelse = t;
}
public double getVægt() {
return vægt;
}
public void setVægt(double v) {
vægt = v;
}
public String getDestination() {
return destination;
}
public void setDestination(String d) {
destination = d;
}
public String toString() {
return " Vægt: " + vægt + " Porto: " + porto;
}
}
Skrevet søn. d. 08. juni 2003 kl. 14:36:15| #49
Giver fejl på porto !
Jeg forslår at du laver følgende:
/**
* Write a description of class BREV here.
*
* @author anders
* @version 10.06.03
*/
abstract public class BREV {
// instance variables - replace the example below with your own
private double længde;
private double bredde;
private double tykkelse;
private double vægt;
private String destination;
/**
* Constructor for objects of class BREV
*/
public BREV(double v, double l, double b, double t, String d) {
vægt = v;
destination = d;
længde = l;
bredde = b;
tykkelse = t;
}
/**
* An example of a method - replace this comment with your own
*
* @param y a sample parameter for a method
* @return the sum of x and y
*/
public double getLængde() {
return længde;
}
public void setLængde(double l) {
længde = l;
}
public double getBredde() {
return bredde;
}
public void setBredde(double b) {
bredde = b;
}
public double getTykkelse() {
return tykkelse;
}
public void setTykkelse(double t) {
tykkelse = t;
}
public double getVægt() {
return vægt;
}
public void setVægt(double v) {
vægt = v;
}
public String getDestination() {
return destination;
}
public void setDestination(String d) {
destination = d;
}
public String toString() {
return " Vægt: " + vægt + " Porto: " + getPorto();
}
abstract double getPorto();
}
Skrevet søn. d. 08. juni 2003 kl. 14:37:10| #50
Så skal STANDARD og STOR og MAXI alle have en metode:
double getPorto() {
}
der udregner porto !
Skrevet søn. d. 08. juni 2003 kl. 14:37:56| #51
To små hovsaer:
1) ignorer den "package test" jeg satte ind i den første version.
2) du må godt lave getPorto til public.
Skrevet søn. d. 08. juni 2003 kl. 14:40:47| #52
ok-det prøver jeg lige at lege med...:)
og i de andre tre klasser skal jeg så bare fjerne alt det som også står her?
Skrevet søn. d. 08. juni 2003 kl. 15:12:21| #53
men hvorfor får jeg hele tiden fejlmeldingen: "cannot resolve symbol"?
Skrevet søn. d. 08. juni 2003 kl. 16:01:10| #54
Svært at sige: hvilken linie ? og hvilket symbol ?
Skrevet søn. d. 08. juni 2003 kl. 16:21:38| #55
Og ingen panik.
Hvis ikke du har fået styr på det i aften, så skal jeg lave 4 klasser
til dig der virker.
Skrevet søn. d. 08. juni 2003 kl. 17:36:37| #56
hold da op...du er godt nok flink...vil gerne sende lidt rødvin eller et eller andet til dig.
Men den skriver faktisk "cannot resolve symbol" flere forskellige steder, bl.a. i flg.:
public BREV(double v, double l, double b, double t, double p, String d) {
vægt = v;
destination = d;
længde = l;
bredde = b;
tykkelse = t;
porto = p; <--------------------------------
}
og i flg.:
public String toString() { <--------------------------------
return " Vægt: " + vægt + " Porto: " + getPorto();
}
abstract double getPorto();
}
Skrevet søn. d. 08. juni 2003 kl. 17:39:54| #57
Den første tror jeg bare skal helt slettes.
Du gemmer ikke porto. Den beregner du.
Den sidste lyder som om getPorto ikke er blevet erklæret som en
abstrakt metode.
Skrevet søn. d. 08. juni 2003 kl. 17:44:38| #58
Når nu jeg har slettet det første, skriver den stadig dette "cannot resolve symbol -constructor BREV" i flg. stykke -og jeg kan virkelig ikke se mig ud af, hvad der skulle være galt..
public MAXI(double v, double l, double b, double t, String d) {
vægt = v;
destination = d;
længde = l;
bredde = b;
tykkelse = t;
}
Skrevet søn. d. 08. juni 2003 kl. 17:46:52| #59
Du kalder jo ikke super (BREV constructor).
Skrevet søn. d. 08. juni 2003 kl. 17:47:37| #60
En af dine holdkammerater (3131) har iøvrigt lige stillet "samme spørgsmål".
:-)
Skrevet søn. d. 08. juni 2003 kl. 17:53:16| #61
ja -det kan jeg se...er da heldigvis ikke den eneste, der ikke har styr på det:)
Skrevet søn. d. 08. juni 2003 kl. 17:56:27| #62
men det, at jeg ikke kalder super, har det noget med det at gøre?
Skrevet søn. d. 08. juni 2003 kl. 17:57:48| #63
så det er altså denne her jeg skal have ind?:
public STANDARD(double v, double l, double b, double t, String d) {
super(v,l,b,t,d);
}
Skrevet søn. d. 08. juni 2003 kl. 17:58:13| #64
Skrevet søn. d. 08. juni 2003 kl. 17:58:37| #65
Iøvrigt håber jeg at have et illustrativt eksempel klar om 10-20 minutter.
Skrevet søn. d. 08. juni 2003 kl. 18:00:34| #66
Skrevet søn. d. 08. juni 2003 kl. 18:02:38| #67
Skrevet søn. d. 08. juni 2003 kl. 18:04:33| #68
Nix.
Jeg er alt for gammel til den slags og bruger kun email.
:-)
Skrevet søn. d. 08. juni 2003 kl. 18:10:08| #69
Følgende eksempel illusterer brug af abstrakt basis-klasse og factory.
Det er næppe en komplet implementering af den logik I skal bruge.
Der er sikkert også andre måder at gøre det på.
Men det compiler og kører !
abstract public class Brev {
protected int vægt;
protected String land;
public Brev(int vægt, String land) {
this.vægt = vægt;
this.land = land;
}
public String getLand() {
return land;
}
public int getVægt() {
return vægt;
}
public void setLand(String land) {
this.land = land;
}
public void setVægt(int vægt) {
this.vægt = vægt;
}
abstract public double beregnPorto();
public String toString() {
return "[Vægt=" + vægt + ",Land=" + land + ", Porto=" + beregnPorto() + "]";
}
}
public class StandardBrev extends Brev {
public StandardBrev(int vægt, String land) {
super(vægt, land);
}
public double beregnPorto() {
return 0; // <--------- skal laves
}
}
public class StorBrev extends Brev {
public StorBrev(int vægt, String land) {
super(vægt, land);
}
public double beregnPorto() {
if(land.equals("Danmark")) {
if(vægt < 50) {
return 5.50;
} else if(vægt < 100) {
return 6.50;
} else if(vægt < 250) {
return 12.00;
} else if(vægt < 500) {
return 20.00;
} else {
return 28.00;
}
} else if(land.equals("Europa")) {
if(vægt < 50) {
return 8.50;
} else if(vægt < 100) {
return 12.00;
} else if(vægt < 250) {
return 19.00;
} else if(vægt < 500) {
return 33.00;
} else {
return 57.00;
}
} else {
if(vægt < 50) {
return 11.50;
} else if(vægt < 100) {
return 18.00;
} else if(vægt < 250) {
return 33.00;
} else if(vægt < 500) {
return 56.00;
} else {
return 95.00;
}
}
}
}
public class MaxiBrev extends Brev {
public MaxiBrev(int vægt, String land) {
super(vægt, land);
}
public double beregnPorto() {
return 0; // <--------- skal laves
}
}
public class BrevFabrik {
public static Brev hentBrev(double længde, double højde, double tykkelse, int vægt, String land) {
if((længde < 23) && (højde < 17) && (tykkelse < 0.5)) {
return new StandardBrev(vægt, land);
} else if((længde < 33) && (højde < 237) && (tykkelse < 2)) {
return new StorBrev(vægt, land);
} else {
return new MaxiBrev(vægt, land);
}
}
}
public class Test {
public static void main(String[] args) {
Brev brev = BrevFabrik.hentBrev(25,10,1,200, "Danmark");
System.out.println(brev);
}
}
Skrevet søn. d. 08. juni 2003 kl. 18:10:48| #70
Når man kører test får man:
[Vægt=200,Land=Danmark, Porto=12.0]
hvilket vistnok er korrekt.
Skrevet søn. d. 08. juni 2003 kl. 18:16:16| #71
laver lige hurtigt noget mad -vender tilbage inden så længe
Skrevet søn. d. 08. juni 2003 kl. 18:59:00| #72
ked af det...men det virker altså heller ikke hos mig:(
Skrevet søn. d. 08. juni 2003 kl. 18:59:48| #73
må jeg evt sende alle 4 klasser til dig, for jeg kan snart ikke overskue det længere:(
Skrevet søn. d. 08. juni 2003 kl. 19:00:10| #74
har sikkert bare lavet nogle dumme fejl som jeg ikke kan se
Skrevet søn. d. 08. juni 2003 kl. 19:07:01| #75
Skrevet søn. d. 08. juni 2003 kl. 19:23:57| #76
tak!
har lige sendt en mail til dig...
Skrevet søn. d. 08. juni 2003 kl. 21:37:15| #77
du er godt nok kommet på arbejde m vores opgave nu....:)
Skrevet søn. d. 08. juni 2003 kl. 22:29:43| #78
Nu virker det sgu!!!! :) :) :)