You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 3 Next »

Denne oppgaven handler om å lage en felles abstrakt superklasse Account for CreditAccount, DebitAccount- og SavingsAccount-klassene.

Denne oppgaven er en annen variant SavingsAccount-oppgaven, med fokus på bruk av abstrakte klasser og arv.

Del 1 - Abstrakt klasse Account

En bank består av mange ulike type kontoer: sparekontoer, brukskontoer, depositumskontoer, støttekontoer etc. Felles for alle kontoer er den abstrakt Account-klassen, som er en utvidelse grensesnittet fra SavingsAccount-oppgaven

Account-klassen har tre metoder:

  • void deposit(double) - øker kontobalansen med innskutt beløp. Merk at det innskutte beløpet må være positivt. Ved ulovlig innskudd skal en IllegalArgumentException utløses.
  • abstract void withdraw(double) - minsker kontobalansen med beløpet som blir tatt ut. Merk at reglene for for uttak er ulik for klassene som implementerer Account, og må derfor implementeres i hver klasse. Hvis uttaksbeløpet er negativt skal metoden kaste en IllegalArgumentException, og hvis det ikke er mulig å ta ut det angitte beløpet skal metoden kaste en IllegalStateException.
  • double getbalance() - returnerer kontobalansen.

I tillegg må Account ha en tilstand balance for saldo på kontoen. Saldoen skal settes til 0 i konstruktøren.

Vær oppmerksom på at du i Del 2 skal lage subklasser av Account og at du ved å bruke rett innkapsling (hintprotected-modifikatoren) kan la subklassene nyttiggjøre seg superklassen i størst mulig grad.

Del 2 - DebitAccount extends Account

En debetkonto er den enkleste formen for konto, hvor det eneste kravet er at saldoen til enhver tid må være større eller lik 0. DebitAccount skal implementere Account og sikre at saldoen aldri går lavere enn 0.

JExercise-testkode for oppgavene finner du her: . Originalkoden (jextest) for testen finner du her: 


Del 3 - CreditAccount extends Account

En CreditAccount har i tillegg til balance en tilstand for creditLine, altså tilgjengelig kreditt på kontoen. Denne kredittlinjen tillater at kontoen kan overtrekkes (at saldoen er negativ) innenfor kredittlinjen. Klassen må ha tilgangsmetoder (getters and setters) for creditLine. Merk at kredittlinjen alltid må være større eller lik 0, hvis ikke skal det kastes en IllegalStateException.

Konstruktøren CreditAccount(double) skal sette kredittlinjen.

JExercise-testkode for oppgavene finner du her: . Originalkoden (jextest) for testen finner du her: 

Del 4 - SavingsAccount extends Account

En SavingsAccount kan kun ha positiv saldo. I tillegg har kontoen uttaksbegrensinger. En SavingsAccount har antall uttak. Dersom man ønsker å ta ut penger etter alle uttak er brukt opp, skal saldoen belastes med en avgiftBåde antall uttak og avgift settes i konstruktøren SavingsAccount(int, double).

JExercise-testkode for oppgavene finner du her:  Originalkoden (jextest) for testen finner du her:


JExercise lar deg sjekke din egen kode vha. forhåndslagde JUnit-tester og JExercise-panelet

Bruk av JExercise:

  1. Sørg for at jexercise-standalone.jar er lagt til i ditt prosjekts Build Path. Dette må gjøres hver gang du oppretter et nytt prosjekt, og det er derfor lurt å gjenbruke samme prosjekt til alle oppgaver.
  2. JExercise-tillegget må være installert. Installer tillegget fra følgende oppdateringsadresse: http://folk.ntnu.no/hal/dev/updatesite.
  3. Åpne JExercise-panelet via Window -> Show View -> Other, og navigere deg fram til JExercise i vinduet som kommer opp, velge det og klikke OK.
  4. Klikke og dra oppgavens testklasse, <oppgavenavn>Test.java fra pakkeoversikten og slippe den i JExercise panelet. 
  5. Testene kan så kjøres ved å dobbeltklikke på testen som ønskes kjørt.

Ved trøbbel, se først om du finner løsningen i Løsninger på trøbbel med JExercise.

Unknown macro: {html}

Twitre gjerne om oppgaven når du er ferdig: <a href="https://twitter.com/share" class="twitter-share-button" data-hashtags="jexercise">Tweet</a>
<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script>

  • No labels