74 lines
4.1 KiB
Markdown
74 lines
4.1 KiB
Markdown
# Arv - AbstractAccount-oppgave
|
|
Denne oppgaven handler om å lage en felles abstrakt superklasse `AbstractAccount`
|
|
for `CreditAccount`, `DebitAccount`- og `SavingsAccount2`-klassene.
|
|
|
|
Denne oppgaven er en annen variant av
|
|
[SavingsAccount](./SavingsAccount.md)-oppgaven, med fokus
|
|
på bruk av abstrakte klasser og arv.
|
|
|
|
### Del 1 - Abstrakt klasse AbstractAccount
|
|
En bank består av mange ulike type kontoer: sparekontoer, brukskontoer,
|
|
depositumskontoer, støttekontoer etc. Siden disse har mye felles, f.eks.
|
|
har alle en balanse, så er det praktisk å samle så mye som mulig av den
|
|
felles logikken i en superklasse, som alle kan arve fra. Denne superklassen
|
|
er imidlertid ikke noen egen type konto, og derfor gjør vi den abstrakt,
|
|
slik at den ikke kan instansieres. De konkrete konto-klassene som arver
|
|
fra den, må selvsagt være instansierbare.
|
|
|
|
Metodene i `AbstractAccount`-klassen, er omtrent de samme som dem vi definerte
|
|
i `Account`-grensesnittet i [SavingsAccount](./SavingsAccount.md)-oppgaven,
|
|
og er som følger:
|
|
|
|
* `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.
|
|
* `void withdraw(double)` - Metoden kaller <code>internalWithdraw(<i>uttaksbeløp</i>)</code>,
|
|
som implementeres i hver subklasse. Hvis uttaksbeløpet er negativt skal
|
|
metoden utløse en `IllegalArgumentException`.
|
|
* `abstract void internalWithdraw(double)` - minsker kontobalansen med beløpet
|
|
som blir tatt ut. Merk at reglene for uttak er ulik for klassene som
|
|
implementerer `AbstractAccount`, og må derfor implementeres i hver klasse.
|
|
Hvis det ikke er mulig å ta ut det angitte beløpet skal metoden utløse en
|
|
`IllegalStateException`.
|
|
* `double getBalance()` - returnerer kontobalansen.
|
|
|
|
Alle metodene utenom den absktrakte må implementeres. I tillegg må
|
|
`AbstractAccount` 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 `AbstractAccount`
|
|
og at du ved å bruke rett innkapsling (hint: `protected`-modifikatoren) skal
|
|
la *subklassene* nyttiggjøre seg *superklassen* i størst mulig grad.
|
|
|
|
|
|
### Del 2 - DebitAccount extends AbstractAccount
|
|
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 utvide
|
|
(arve fra med `extends`) `AbstractAccount` og sikre at saldoen aldri blir
|
|
lavere enn 0.
|
|
|
|
Testkode for oppgavene finner du her: [inheritance/DebitAccountTest.java](../../src/test/java/inheritance/DebitAccountTest.java).
|
|
|
|
### Del 3 - CreditAccount extends AbstractAccount
|
|
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 utløses
|
|
en `IllegalArgumentException`. Hvis en ny kredittlinje settes og balansen er
|
|
negativ, må den nye kredittlinjen dekke den eksisterende balansen. Ellers skal
|
|
det utløses en `IllegalStateException` og ingen endring i kredittlinjen.
|
|
|
|
Konstruktøren `CreditAccount(double)` skal sette kredittlinjen.
|
|
|
|
Testkode for oppgavene finner du her: [inheritance/CreditAccountTest.java](../../src/test/java/inheritance/CreditAccountTest.java).
|
|
|
|
### Del 4 - SavingsAccount2 extends AbstractAccount
|
|
En `SavingsAccount2` (*merk at navnet er endret, for ikke å kræsje med
|
|
SavingsAccount-klassen fra den tidligere oppgaven!*) kan kun ha positiv saldo.
|
|
I tillegg har kontoen uttaksbegrensinger. En `SavingsAccount2` har *x* antall
|
|
*uttak* (**withdrawals**). Dersom man ønsker å ta ut penger etter alle uttak er
|
|
brukt opp, skal saldoen belastes med et *gebyr* (**fee**). Både **withdrawals**
|
|
(antall) og **fee** (beløp) settes i konstruktøren `SavingsAccount2(int, double)`.
|
|
|
|
Testkode for oppgavene finner du her: [inheritance/SavingsAccount2Test.java](../../src/test/java/inheritance/SavingsAccount2Test.java). |