Avatar billede nanders Nybegynder
28. september 2003 - 13:24 Der er 16 kommentarer og
1 løsning

Brug af abstrakte klasser.

Kære eksperter

Jeg er ved at lave et program der holder styr på et mobilabonnement.

Man kan:

i) Indbetale penge på sin konto
ii) Købe samtaler
iii) Købe SMS'ere

Mit problem består i, at jeg ikke kan opdatere saldoen i klassen abonnement, som følge af en indbetaling, uden at den smider en nullpointer exception.

Følgende klasse tager mod en indbetaling:

/**
* Klassen Indbetaling modellerer en indbetaling
* på en konto for et mobilabonnement.
*
* @version 28. september 2003
*/
public class Indbetaling extends Transaktion {

// Bemærk at den har superklassen Transaktion

    private int indbetalingsBeløb;
   
    /**
    * Konstruktør, der opretter en indbetaling
    *
    * @param beløb Det beløb, som indbetales.
    */
    public Indbetaling(int beløb) {
       
        indbetalingsBeløb = beløb;
    }

    public String toString() {
       
        return "De har indbetalt " + indbetalingsBeløb + " kroner";
                  }

    /**
    * Returnerer det beløb, som skal konteres kundens konto
    *
    * @return Beløbet, som skal konteres kundens konto
    */
    public int beløb() {
        return indbetalingsBeløb;
    }
}

Denne klasse bruger den abstrakte klasse Transaktion:


public abstract class Transaktion {
    /**
    * beløb er en abstrakt metode, der skal returnere det beløb,
    * som skal konteres kundens konto når transaktionen bliver udført.
    *
    * @return Beløbet, som skal konteres kundens konto.
    */
    public abstract int beløb();
}

Hvis der f.eks. sker en indbetaling på 4, kan man se at beløbet i Transaktion også er 4.

Her er Abonnement:

import java.util.*;

/**
* Klassen Abonnement modellerer et mobilabonnement hos Talkmore.
*
* @author Michael E. Caspersen & Jesper Makholm Byskov
* @version 23. september 2003
*/
public class Abonnement {

    private String telefonnummer;
    private List transaktioner;
    private int saldo;
    private Transaktion tr;
    public Abonnement (String telefonnummer) {
        this.telefonnummer = telefonnummer;
        saldo = 200;
        transaktioner = new ArrayList();
            }


    /**
    * Tilføjer en transaktion til listen over transaktioner
    *
    * @param t Transaktionen, der skal tilføjes
    */
    public void tilføjTransaktion(Transaktion t) {
       
        transaktioner.add(t);
    }

    public String toString() {
        String temp = "Abonnenten er " + telefonnummer + " . Abonentens saldo er " + saldo;
       
        return temp;
            }

    /**
    * Returnerer saldoen på kontoen
    *
    * @return Saldoen på kontoen
    */
    public int saldo() {
                 
            return saldo - tr.beløb();
    }
}

Hvordan får jeg den til at opdatere beløbet i Abonnement - således, at hver gang beløb ændres i Transaktion , at saldo opdateres i Abonnement ?

mvh.

nanders
Avatar billede riversen Nybegynder
28. september 2003 - 13:27 #1
private List transaktioner = new List();

du har glemt at initalisere listen med transaktioner
Avatar billede riversen Nybegynder
28. september 2003 - 13:28 #2
næ sorry
Avatar billede arne_v Ekspert
28. september 2003 - 13:30 #3
Det er tr som er uinitialiseret og derfor null.
Avatar billede riversen Nybegynder
28. september 2003 - 13:31 #4
nå, så er det jo ikke i forbindelse med indsættelse af beløb :-)
Avatar billede arne_v Ekspert
28. september 2003 - 13:31 #5
Prøv med:

    public void tilføjTransaktion(Transaktion t) {
     
        transaktioner.add(t);
        saldo = saldo - t.beløb();
    }

    public int saldo() {
               
            return saldo;
    }
Avatar billede nanders Nybegynder
28. september 2003 - 13:34 #6
Hvordan initialiserer jeg tr i min konstructor i Abonnement .

Bemærk at Transaktion er abstract.
Avatar billede arne_v Ekspert
28. september 2003 - 13:37 #7
Jeg tror slet ikke at tr skal initilaseres - den skal slettes.

Se løsnings forslag ovenfor.

NB: At Transaktion er abstrakt (kunne iøvrigt have været lavet som interface)
    spiller så vidt jeg kan bvurdere ikke nogen rolle.
Avatar billede nanders Nybegynder
28. september 2003 - 13:41 #8
Hej Arne

Det virker ikke,

Hvis jeg prøver at initialisere t i min kconxtructor vil den ikke idet Transaktion er abstract.

dvs. t = new Transaktion(); dur ikke.

/nanders
Avatar billede arne_v Ekspert
28. september 2003 - 13:45 #9
Det er korrekt.

Men sådan skal den vel heller ikke bruges.

Det må vel være:

Abonnement abn = new Abonnement("12345678");
Transaktion tx = new Indbetaling(100);
abn.tilføjTransaktion(tx);
Avatar billede nanders Nybegynder
28. september 2003 - 13:48 #10
Men hvor skulle jeg gøre det henne

Når jeg har mit abonnement siger jeg jo netop at mit abonnement har et nummer.

og indbetalingen skal være på et i Indbetaling givent beløb.
Avatar billede arne_v Ekspert
28. september 2003 - 13:51 #11
Det skal vel gøres i din main class ?

Mit eksempel var en indbetaling på 100.
Avatar billede nanders Nybegynder
28. september 2003 - 13:53 #12
Vil du mene, at min main class er Abonnement ?

Det er jo herfra at saldoen hentes.

Hvordan skulle det i givet fald skrives ?
Avatar billede arne_v Ekspert
28. september 2003 - 13:56 #13
Main class er den klasse som indeholder main metoden og den klasse som du kører
når du kører programmet.
Avatar billede nanders Nybegynder
28. september 2003 - 13:58 #14
Det er så Abonnement.

Jeg får forstår bare stadig ikke hvordan jeg får fat i beløb fra Abonnement klassen. Det ser ud som om, at alt hvad der foregår i Transaktion er utilgængeligt herfra.
Avatar billede nanders Nybegynder
28. september 2003 - 14:03 #15
Hej Arne,

Så tror jeg at jeg fandt ud af det. Det var rigtigt det du skrev med at jeg skulle "have fat" i transaktionen før at den blev registreret.
Avatar billede nanders Nybegynder
28. september 2003 - 14:07 #16
Hej Arne,

Du får de 30 point...

/nanders
Avatar billede arne_v Ekspert
28. september 2003 - 14:11 #17
OK

(selvom jeg ikke er helt sikker på at jeg har forstået alting)
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester