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

Compare with Current View Page History

« Previous Version 20 Next »

Denne oppgaven handler om å lage en felles superklasse SavingsAccount for BSU- og ForeldreSpar-klassene. SavingsAccount skal dessuten implementere Account-grensesnittet.

Denne oppgaven bygger videre på Account-oppgavene under Gyldig tilstand, Innkapsling og Tilstand og oppførsel.

Del 1 - SavingsAccount implements Accout

En bank består av mange ulike type kontoer: sparekontoer, brukskontoer, depositumskontoer, støttekontoer etc. Felles for alle kontoer er Account-grensesnittet, som er definert under:

package inheritance;
 
public interface Account {

	public void deposit(double amount);

	public void withdraw(double amount);

	public double getBalance();
}

Vi skal i denne oppgaven fokusere på sparekontoer og du skal nå lage en SavingsAccount-superklasse, som implementerer Account-grensesnittet. Funksjonaliteten som hver av metodene definert i grensesnittet over skal støtte er:

  • void deposit(double) - inkrementerer kontobalansen med innskutt beløp. Merk at det innskutte beløpet må være positivt. Ved ulovlig innskudd skal en IllegalArgumentException utløses.
  • void withdraw(double) - dekrementerer kontobalansen med beløpet som blir tatt ut. Merk at uttaksbeløpet må være positivt og dersom dette er tilfredsstilt skal et unntak av typen IllegalArgumentException utløses. Dersom det ikke er dekning på kontoen (en SavingsAccount kan ikke ha negativ balanse) skal et unntak av typen IllegalStateException utløses.
  • double getbalance() - returnerer kontobalansen.

I tillegg til å støtte Account-grensesnittet over, som er felles for alle kontoer, skal sparekontoer ha en rentefot og en metode som forrenter kontoen. Denne kalles av bankene for hver sparekonto på slutten av året slik at alle dets kunder opptjener renter (ikke tenk på at banker egentlig holder styr på hvor stor balansen har vært gjennom hele året eller forrenter kontoen kontinuerlig - her skal vi bare anta at innestående kontobalanse ved årsslutt forrentes i sin helhet) - derfor heter metoden endYear(). I tillegg skal SavingsAccount-klassen ha en konstruktør som tvinger alle objekter av denne typen til å bli instansiert med et navn, en åpningsbalanse og en rentefot. Dette er oppsummert her:

  • SavingsAccount(String, double) - konstruktør som tar inn navn på kontoinnehaver og rentefoten på kontoen og setter klassens felter i henhold til disse. Legg inn rentefoten som et desimaltall (f.eks. tilsvarer 0.05 en rente på 5%). Åpningsbalansen skal være 0.

  • void accrueInterest() - forrenter kontobalansen basert på rentefoten.

I din implementasjon av SavingsAccount, vær oppmerksom på at du i Del 2 og 3 skal lage subklasser av denne klassen og at ved å bruke rett innkapsling (hintprotected-modifikatoren) kan du la subklassene nyttiggjøre seg superklassen i størst mulig grad.

Del 2 - BSU extends SavingsAccount

I tillegg til generelle sparekontoer finnes det en spesiell type sparekonto som heter BSU. Du skal nå lage en BSU-klasse som arver fra SavingsAccount-superklassen. Her er målet at du skal gjenbruke mest mulig av superklassen samtidig som støtte for den spesielle oppførselen til kontoer av typen BSU er tilfredstilt. En BSU-konto er, i tillegg til å være en sparekonto, spesiell i den forstand at det kun er lovlig å sette inn inntil et forhåndsbestemt beløp per år (kr 25 000 for 2014 fastsatt av den nye regjeringen) og at det kun er lovlig å ta ut av det beløpet som er satt inn siste år. M.a.o. vil en ved årsskifte få mulighet til å sette inn nye innskudd innenfor innskuddsgrensen, men en har ikke lenger mulighet til å ta ut hele balansen (innskudd fra tidligere år låses). Årsskifte markeres ved at metoden accrueInterest() kalles. Følgelig må denne metoden, i tillegg til flere andre (som ikke nevnes med navn siden det er den av oppgaven å finne ut hvilke:-)), redefineres i BSU-subklassen. I tillegg til dette stilles følgende eksplisitte krav til klassen:

  • BSU(String, double, double, double) - konstruktør som tar inn navn på kontoinnehaver, åpningsbalanse og rentefoten på kontoen i tillegg til et desimaltall som angir hvor mye det er tillatt å sette inn på kontoen per år og setter klassens felter i henhold til disse. 

  • double getTaxDeduction() - returnerer skattefradrag for inneværende år. Dette vil være 20% av innskutt(e) beløp siste år.

Implementasjonshint: legg til felter som holder styr på hvor mye balanse som er tilgjengelig (availableBalance) og innskuddsgrensen (depositLimit), sjekk at metodekall som deposit / withdraw tilfredsstiller disse og kaller superklassens metoder ved kallene super.deposit(amount) og super.withdraw(amount), henholdsvis.

Del 3 - ForeldreSpar extends SavingsAccount

En anne spesiell type sparekonto, her kalt ForeldreSpar, har et begrenset antall lovlige uttak per år (ofte i bytte mot en høyere rente). Du skal nå lage en slik ForeldreSpar-klasse som arver fra SavingsAccount-superklassen. Her er igjen målet at du skal gjenbruke mest mulig av superklassen samtidig som støtte for den spesielle oppførselen til kontoer av typen ForeldreSpar er tilfredstilt. Denne klassen skal holde styr på at kun det lovlige antallet uttak gjøres i løpet av et år. Årsskifte markeres igjen ved at metoden accrueInterest() kalles. Følgelig må denne metoden, i tillegg til flere andre (som ikke nevnes med navn siden det er den av oppgaven å finne ut hvilke:-)), redefineres i ForeldreSpar-subklassen. I tillegg til dette stilles følgende eksplisitte krav til klassen:

  • ForeldreSpar(String, double, double, int) - konstruktør som tar inn navn på kontoinnehaver, åpningsbalanse og rentefoten på kontoen i tillegg til et heltall som angir antall lovlige uttak per år og setter klassens felter i henhold til disse.

  • int getRemainingWithdrawals() - returnerer antall gjenstående uttak fra sparekontoen.

Implementasjonshint: legg til et felter som holder styr på hvor mange uttak som er gjort siste år (withdrawCount) og antall lovlige uttak (withdrawLimit), sjekk at metodekall som withdraw tilfredsstiller disse og kaller superklassens metoder ved kallet super.withdraw(amount).


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