05. januar 2003 - 12:45Der er
27 kommentarer og 1 løsning
metodekald fra en konstruktør til en anden klasse
Hvis man har oprettet en konstruktør i en klasse, men har brug for at denne konstruktør også bruger en metode fra en anden klasse, hvordan gøres dette og er det muligt ????
I dette særtema om aspekter af AI ser vi på skiftet fra sprogmodeller til AI-agenter, og hvordan virksomheder kan navigere i spændet mellem teknologisk hastighed og behovet for menneskelig kontrol.
OK. Desværre løser det ikke helt vores problem. Tror at problemet ligger et andet sted. Vi har oprettet en vector hvor vi gemmer et (Bil) objekt med forskellige atributter. Vectoren ligger i en anden klasse end der hvor Bil objektet oprettes. Når vi gennemser denne vector for at få udskrevet de forskellige atributter få vi en fejlmeddelelse.
Kildekode fra Klassen Prisgruppe: /* Denne klasse skal oprette kunne oprette fire forskellige prisgrupper. Dette gøres ved at brugeren af programmet angiver prisgruppen ved at taste enten et A, B, C eller et D. Hvis A bliver angivet som parameter vil en prisgruppe med en pris fx. 700 kr. blive oprettet. Det skal være muligt at ændre prisen for de forskellige prisgrupper, men som udgangspunkt vil en standart værdi blive sat. */ import java.util.*; import java.awt.*;
public class Prisgruppe { private int pris; private String type = ""; // private String type = ""; // throws testUntagelser_A // String nyBilType; //........... ........... ........... ...........
//........... ........... ........... ........... // opretter en container til at gæmme bil objekterne i
public Vector bilcontainer;
public Prisgruppe(){ bilcontainer = new Vector(); } //................ ................ ................ // Tilføjer et bil objekt til listen public void addbil(Bil i){ bilcontainer.add(i); } //................ ................ ................ // Slætter et bil objekt fra listen public void slet_Bil(Bil i){ bilcontainer.removeElement(i); System.out.println("Bil slettet fra listen "+ i); } //................ ................ ................ // Metoden finder bilens atributter ud fra en angivet nummerplade
public Bil find_bil_Nummeplade(int i) { Bil b = null; Bil retur = null;
for(int n=0;n<bilcontainer.size();n++){ b = (Bil) bilcontainer.get(n); if (b.getNummerplade() == i) System.out.println("\n"+"Bilen med nummerpladen "+b.getNummerplade()+ " fundet med følgende atributter; kørte_km "+ b.getKm() +", bilmærke " +b.get_bilmerke() + ", købsdato (dag,månede,år) "+ b.get_Dag()+ "." +b.get_Moenede()+ "." +b.get_AAr()+", Prisklasse "+b.getPris_G()+", koster "+b.pris+" kr."+"\n"); { retur = b; break; } } return retur; } //........... ........... ........... ........... public void print_Pris(int nyPris){ if (nyPris < 0) System.out.println("En bils pris må ikke angives med et negativt beløb"); else { System.out.println("Prisen = "+ nyPris); SetPris(nyPris); } return; }
public int getPrise(){ return pris; }
private void SetPris(int nyPris){ pris = nyPris; return; } //........... ........... ........... ........... // Er rykket til Bil klassen
public class P_gruppeFindesIkke extends Exception { public void nyPrisgruppe;
public P_gruppeFindesIkke(String nyBilType){ //("En Prisgruppe skal angives enten med et A, B, C eller et D " +nyBilType+" vil ikke virke"); nyPrisgruppe = nyBilType; } } public String nyPrisgruppe(String nyBilType){ try{ //throw new P_gruppeFindesIkke("Hej Verden"); if ((! nyBilType.equals ("A")) && (! nyBilType.equals ("B")) && (! nyBilType.equals ("C")) && (! nyBilType.equals ("D")) ) throw new P_gruppeFindesIkke(nyBilType);
if (nyBilType.equals ("A")){ pris = 1000; } else if (nyBilType.equals ("B")){ pris = 700; } else if (nyBilType.equals ("C")){ pris = 500; } else if(nyBilType.equals ("D")){ pris = 300; }
SetPris_G(nyBilType); }
catch (P_gruppeFindesIkke nyPrisgruppe){ System.out.println( "Undtagelse fanget: " + nyBilType + " en biltype skal angives med ved at tast A, B, C eller D. "); } }
public String getPris_G(){ return type; }
private void SetPris_G(String nyBilType){ type = nyBilType; } } Kildekode fra Klassen Bil: import java.util.*;
public class Bil {
public String AAnummer = "AA"; //Tilføjes nummepladen, viser hvilken prisgruppe //bilen tilhøer. Dette er ikke fuldt udviklet da der ikke kan laves nye variabler, når //der oprettes nye prisgrupper. Er en midlertidige løsning
// defination af alle variabler som et bil objekt bruger: Under konstruktion // public int sidstSynetDato;
//boolean fuld_tank; //boolean på_værksted;
public int pris; // private String type = "";
private String bilmerke; //opret_bilmærke() private int nummerplade; //opretNummeplade()
private int km0; //kørte_km() private int dato_Dag; //købsdato() private int dato_Moenede; //købsdato() private int dato_AAr; //købsdato()
private int dag_S; //købsdato() private int månede_S; //købsdato() private int år_S; //købsdato()
//metoder der skal oprettes //Opdater kørte km //Opdater bilstatus
//................ ................ ................ // Variabler der skal tilføjes; int sidstSynetDato
public Bil(int nummerplade, int kørte_km, int dag, int månede, int år, String bilmerke, int dag_S, int månede_S, int år_S, String nyBilType){
//................ ................ ................ // Metoden angiv_kørte_km har to formål, dels at ændre bilens kørte km og dels at tjække for, // at km ikke overstiger en fatsat størrelse da den så skal sælges.
public void angiv_kørte_km(int km){
if(km < 0) System.out.println("Antal kørte km. skal angives med et positivt tal");
if(km > 100000)
System.out.println("Det er tid til at sælge bilen med nummerpladen " + AAnummer+""+ nummerplade+ "\nda den nu har kørt " +km+" km" ); else { System.out.println("Bilen med nummeplade "+ AAnummer+ "" + nummerplade + " har nu kørt "+km+" km.");
SetKm(km); } }
// Opretter get'er & set'er for angiv_kørte_km
public int getKm(){ return km0; }
private void SetKm(int km){ km0 = km; } //................ ................ ................ // Bruger get og set til at printe nummerpladen til skærmen
public void opretNummeplade(int nummerplade){ if (nummerplade < 100000 && nummerplade > 0 || nummerplade > 999999) System.out.println("En nummeplade skal indeholde 6 tal cifre.\nDesuden skal den angives med et tal større end 100000 og ikke tallet " +nummerplade+"\n"); else if (nummerplade < 000000) System.out.println("En nummeplade må ikke angives med et negativt tal " +nummerplade); else { System.out.println("Bilen med nummeplade "+ AAnummer+""+nummerplade+ " oprettet"); SetNummerplade(nummerplade); } }
public int getNummerplade(){ return nummerplade; }
// Denne metode tager ikke højde for måneder med mindre end 31 dage eller skud år. // Metoden oprette en købsdato for bilen
public void købsdato(int dag, int månede, int år){ if(dag < 1 || dag > 31) System.out.println("En dag skal angives i intervallet mellem 1 - 31"); if(månede < 01 || månede > 12) System.out.println("En månede skal angives i intervallet mellem 1 - 12"); if(år < 0 || år > 9999) System.out.println("Et år skal angives i intervallet mellem 1 - 9999");
else { System.out.println("Bilens købsdato er "+ dag+ "."+månede+"."+år+ "\n");
Set_data(dag, månede, år); } }
// Opretter get'er & set'er for dato
public int get_Dag(){ return dato_Dag; }
public int get_Moenede(){ return dato_Moenede; }
public int get_AAr(){ return dato_AAr; }
private void Set_data(int dag, int månede, int år){ this.dato_Dag = dag; this.dato_Moenede = månede; this.dato_AAr = år; }
//................ ................ ................ // SKABILON !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! // Metoden tjækker at bilmærket findes
public void opret_bilmærke(String bilmerke){
if(bilmerke.equals ("fiat") || bilmerke.equals ("opel")) System.out.println("Bilmærke oprettet sat til "+bilmerke);
else
{ System.out.println("Angiv fiat eller opel som bilmærke"); // set_bilmærke(bilmerke); }
set_bilmærke(bilmerke); }
public String get_bilmerke(){ return bilmerke; }
private void set_bilmærke(String newbilmerke){ this.bilmerke = newbilmerke; } //................ ................ ................ // Denne metode tager ikke højde for måneder med mindre end 31 dage eller skud år. // ikke færdig
public void opret_sidsteSynetDato(int dag_S, int månede_S, int år_S){
if(dag_S < 1 || dag_S > 31) System.out.println("En dag skal angives i intervallet mellem 1 - 31"); if(månede_S < 01 || månede_S > 12) System.out.println("En månede skal angives i intervallet mellem 1 - 12"); if(år_S < 0 || år_S > 9999) System.out.println("Et år skal angives i intervallet mellem 1 - 9999");
else {
//System.out.println("Bilens er sidst synet "+ dag_S+ "."+månede_S+"."+år_S+ "\n");
// Her skal oprettes en metode til at udregne hvorlang tid der til næste synsdato og en // Advarsen skal sinaleres 2 uger før denne dato er nået // Er ikke færdig endnu
Date netopNu; Date sidsteSynsDato_Variabel; Date ny_Syns_Dato;
netopNu = new Date(); sidsteSynsDato_Variabel = new Date(år_S,månede_S-1,dag_S); ny_Syns_Dato = new Date(år_S+1,månede_S+11,dag_S+14);
Derudover bør i også kigge på Bil::angiv_kørte_km(int)
faktisk tester i kun på det angivne antal km, og ikke det totale antal kørte (der udover så overskriver Bil::setKm() også km variablen ... Jeg tror jeres hesigt mere ligger i en Bil::tilføjNyKørsel(), som lægger int til bilens nuværende kørselstæller)
Følgende lettere tilrettede version kan oversætte (men jeg ved ikke om den virker som I vil have det):
/* Denne klasse skal oprette kunne oprette fire forskellige prisgrupper. Dette gøres ved at brugeren af programmet angiver prisgruppen ved at taste enten et A, B, C eller et D. Hvis A bliver angivet som parameter vil en prisgruppe med en pris fx. 700 kr. blive oprettet. Det skal være muligt at ændre prisen for de forskellige prisgrupper, men som udgangspunkt vil en standart værdi blive sat. */ import java.util.*; import java.awt.*;
public class Prisgruppe { private int pris; private String type = ""; // private String type = ""; // throws testUntagelser_A // String nyBilType; //........... ........... ........... ...........
//........... ........... ........... ........... // opretter en container til at gæmme bil objekterne i
public Vector bilcontainer;
public Prisgruppe() { bilcontainer = new Vector(); } //................ ................ ................ // Tilføjer et bil objekt til listen public void addbil(Bil i) { bilcontainer.add(i); } //................ ................ ................ // Slætter et bil objekt fra listen public void slet_Bil(Bil i) { bilcontainer.removeElement(i); System.out.println("Bil slettet fra listen " + i); } //................ ................ ................ // Metoden finder bilens atributter ud fra en angivet nummerplade
public Bil find_bil_Nummeplade(int i) { Bil b = null; Bil retur = null;
for (int n = 0; n < bilcontainer.size(); n++) { b = (Bil) bilcontainer.get(n); if (b.getNummerplade() == i) System.out.println( "\n" + "Bilen med nummerpladen " + b.getNummerplade() + " fundet med følgende atributter; kørte_km " + b.getKm() + ", bilmærke " + b.get_bilmerke() + ", købsdato (dag,månede,år) " + b.get_Dag() + "." + b.get_Moenede() + "." + b.get_AAr() + ", Prisklasse " + getPris_G() + ", koster " + b.pris + " kr." + "\n"); { retur = b; break; } } return retur; } //........... ........... ........... ........... public void print_Pris(int nyPris) { if (nyPris < 0) System.out.println( "En bils pris må ikke angives med et negativt beløb"); else { System.out.println("Prisen = " + nyPris); SetPris(nyPris); } return; }
public int getPrise() { return pris; }
private void SetPris(int nyPris) { pris = nyPris; return; } //........... ........... ........... ........... // Er rykket til Bil klassen
public String nyPrisgruppe;
public void P_gruppeFindesIkke(String nyBilType) { //("En Prisgruppe skal angives enten med et A, B, C eller et D " +nyBilType+" vil ikke virke"); nyPrisgruppe = nyBilType; } public void nyPrisgruppe(String nyBilType) { try { //throw new P_gruppeFindesIkke("Hej Verden"); if ((!nyBilType.equals("A")) && (!nyBilType.equals("B")) && (!nyBilType.equals("C")) && (!nyBilType.equals("D"))) throw new Exception(nyBilType);
if (nyBilType.equals("A")) { pris = 1000; } else if (nyBilType.equals("B")) { pris = 700; } else if (nyBilType.equals("C")) { pris = 500; } else if (nyBilType.equals("D")) { pris = 300; }
SetPris_G(nyBilType); } catch (Exception ex) { System.out.println( "Undtagelse fanget: " + ex + " en biltype skal angives med ved at tast A, B, C eller D. "); } }
public String getPris_G() { return type; }
private void SetPris_G(String nyBilType) { type = nyBilType; } }
Og denne metode: public void opret_sidsteSynetDato(int dag_S, int månede_S, int år_S){ .. } I tester ikke hvilken måned det, der er jo forskellige antal dage i hver måned - og hvad med skudår?
private boolen isLeapYear( int year ) { if ( (year % 4 == 0 ) && ( year % 400 == 0) && (year % 100 != 0 )) return true;
Er det ikke også lidt optimistisk at lade år helt op til 9999 at være godkendte? Kan man leje så lang tid ind i fremtiden?
arne >> angående Bil::opret_sidsteSynetDato(), så står der jo : // Denne metode tager ikke højde for måneder med mindre end 31 dage eller skud år. // ikke færdig
Måske man bare burde føre data'ene ind i Calendar-obj og lade den komme med fejl, hvis nogle af parameterne er out-of-bounds
topperware >> Jeg kan se, at i har lavet det sådan at jeres Bil-objekter bliver aggregeret op i en prisgruppe - Og at i "formentlig" opretter 4 prisgrupper...
At lave "søg-via-nummerplade" er det ikke lidt forkert placeret på prisgruppen -- taler vi om en tilfældig bil skal i i dette tilfælde søge prisgrupperne igennem - og ikke f.eks. en BilPool (samling af biler)
Jeg kunne mere forestille mig følgende UML : BilPool<>--Bil---Prisgruppe--<>PrisgruppePool
Og så gøre BilPoolen ansvarlig for at finde en given bil... En løs association mellem Bil og Prisgruppe gør det også nemmere 1) oprette nye prisgrupper 2) flytte biler til andre prisgrupper
Håber det giver mening
Eller evt. Bil--<>Prisgruppe, hvis i let vil liste alle Bil-objekter i en given Prisgruppe...
Tak for alle svarene Desværre udskrives prisgruppen (A,B,C eller D) ikke ?? Ellers ser det ok ud
Her er hvad der udskrives i forbindelse med det relevante:
Bilen med nummerpladen 111111 fundet med følgende atributter; kørte_km 1000, bilmærke opel, købsdato (dag,månede,år) 11.12.2002, Prisklasse , koster 0 kr.
Det er Prisklasse som skal udskrive A,B,C eller D. Desuden udskrives prisen til 0 hviklet jo ikke er rigtigt.
Vi takker mange gange for den store interesse, samt mange gode forslag det tildels har hjulpet os, men nu er vi ved at miste overbillet og tror det er mest hensigtsmæssigt at lukke spørgsmålet.
Så vidt vi kunne se var det ikke muligt at give point på anden måde, men selvfølgelig giver vi gerne point for den store hjælp. Så hvordan gør vi lige det?
Opretter et spm som hedder "points til bearhugx" (og arne_v, hvis han melder sig)
I det spm skal i specifikt nævne at det handler om http://www.eksperten.dk/spm/301139 -- evt. med link samt nævne grunden for at i opretter et point-overførsels-spørgsmål
evt. prøv at kig på udformningen af et (af de snart utallige) point til ..... spørgsmål
Jeg siger aldrig nej til point, men vil overlade det til topperware at vurdere om jeg har fortjent dem.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.