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

Compare with Current View Page History

« Previous Version 3 Next »

Oppgaven handler om å lage en superklasse som gjelder for kalkulatorer. Man skal så lage tre typer kalkulator-klasser som arver fra denne: SimpleCalc, RPNCalc, PNCalc

Denne oppgaven inneholder elementer fra kalkulator-oppgavene under Tilstand og oppførsel. Formålet med oppgaven er å bli kjent med arv i objektorientert programmering. Du skal implementere en superklasse for kalkulatorer og underklasser for en vanlig kalkulator og en RPN-kalkulator - og flere hvis du vil - f.eks en PN-kalkulator (polish notation). Superklassen brukes av et kalkulatorprogram. Når kalkulatorprogrammer starter, skal det spørre brukeren om hvilken type kalkulator som skal brukes. Oppgaven er skrever med tanke på å ikke innføre unødvendig kompleksitet. Du trenger ikke å følge oppgaven til punkt og prikke hvis du mener noe kan gjøres på en bedre måte.

Del 1: Calculator-klassen

Implementer en abstrakt klasse Calculator med metodene:

  • protected void setLeftOperand(double operand): skal sette venstre operand
  • protected void setRightOperand(double operand): skal sette høyre operand
  • protected void setOperator(char operator): skal sette operatoren til en av '+', '-', '*', '/'
  • protected double getResult(): skal returnere resultatet av utregningen
  • abstract public void takeInputNumber(double number): brukes av underklassen til å ta inn et tall skrevet inn
  • abstract public void takeInputOperator(char operator): brukes av underklassen til å ta inn en operator skrevet inn

  • abstract public boolean hasOutput(): returnerer om det er på tide å lese av et svar

  • abstract public double getOutput(): returenerer svartet

At en klasse er abstrakt betyr at du ikke kan instansisere den. Med andre ord: du kan ikke si new Calculator(). En klasse gjøres abstrakt så den kan inneholde abstrakte metoder: metoder som ikke er definert. Dette gjøres ganske enkelt ved å ikke ha med klammeparentesene med definisjonen av metoden etter deklarasjonen, men heller bare et semikolon. For eksempel:

abstract class MyAbstractClass {
	abstract void myAbstractMethod(int parameter);
}

På den måten sier du at objekter av MyAbstractClass har en myAbstractMethod, uten å ha bestemt hva den egentlig gjør. takeInputNumber, takeInputOperator, hasOutput og getOutput skal altså ikke defineres i superklassen Calculator.

Del 2: Underklasser

Underklassene SimpleCalculator og RPNCalculator skal arve fra Calculator. De skal ikke være abstrakte, så de er nødt til å implementere de abstrakte metodene i Calculator-klassen. De bestemmer hva som skjer når det kommer inn et tall eller en operator:

SimpleCalculator:

Når det kommer inn et tall, og det forrige som kom inn ikke var en operator, skal tallet tas til å være venstre operand.
Når det kommer inn et tall, og der forrige som kom inn var en operator, skal tallet tas til å være høyre operand, og intil noe annet kommer kommer inn, skal hasOutput returnere true og getOutput skal være resultatet av utregningen. Resultatet skal også tas til å være venstre operand til neste gang.
Når det kommer inn en operator, skal det selfølgelig tas til å være operatoren skal skal brukes i utregningen.

RPNCalculator:

Når det kommer inn et tall, skal det gå på stacken.
Når det kommer inn en operator, skal operandene komme av stakken, og hasOutput returnere true og getOutput skal være resultatet av utregningen inntil noe annen kommer inn. Resultatet skal også inn på toppen av stakken.

Del 3: Hovedprogramklasse

Lag en hovedprogramklasse med init og run metoder som spør brukeren om hvilken type kalkulator som skal brukes og kjører denne med input og output. Husk at en underklasse kan også brukes som overklassen. Et felt av type Calculator kan være både en SimpleCalculator og en RPNCalculator.

  • No labels