Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Exercise-panelet

Bruk av Exercise-panelet er obligatorisk for denne øvingen. Du må ha panelet åpent med CalculatorInheritance.ex-filen (tests > inheritance > CalculatorInheritance.ex) i før du begynner med oppgaven. For mer informasjon/hjelp, se nederst på forrige side, altså hovedsiden for Øving 9.

 

Excerpt

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

Denne oppgaven inneholder elementer fra oppgavene Calculator og RPN-kalkulator-oppgavene under Tilstand og oppførsel. Formålet med oppgaven er å bli kjent med mekanismen for arv i objektorientert programmering. Du skal implementere en superklasse for kalkulatorer og underklasser for SimpleCalculator som fungerer som en vanlig kalkulator og en RPN-kalkulator - og flere hvis du vil - f.eks en PN-kalkulator (polish notation). Superklassen brukes av et kalkulatorprogramenkel kalkulator. Denne skal også brukes som en superklasse for en RPN-kalkulator. 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:

...

SimpleCalculator-klassen

Implementer en abstrakt klasse Calculator SimpleCalculator 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:

Code Block
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:
  • returnerer svaret

SimpleCalculator skal fungere slik:

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 inntil 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.

Testkode for SimpleCalculator finner du her: inheritance/SimpleCalculatorTest.java. Originalkoden (jextest) for testen finner du her: inheritance/SimpleCalculator.jextest.

Del 2: Subklasser

Lag en subklasse RPNCalculator. Denne skal arve fra SimpleCalculator, og skal redefinere takeInputNumber, takeInputOperator, hasOutput og getOutput. Her skal du gjenbruke resten av metodene fra SimpleCalculator.

RPNCalculator skal fungere slik:

Når det kommer inn et tall, skal det gå på stacken.
Når det kommer inn en operator, skal operandene de første to tallene komme av stakken og bli regnet sammen, og  hasOutput returnere true og getOutput skal være resultatet av utregningen inntil noe annen annet kommer inn. Resultatet skal også inn på toppen av stakken.

Testkode for RPNCalculator finner du her: inheritance/RPNCalculatorTest.java. Originalkoden (jextest) for testen finner du her: inheritance/RPNCalculator.jextest.

Del 3:

...

Main-metode eller hovedprogramklasse

Lag en hovedprogramklasse med init og run metoder som spør en main-metode eller en hovedprogramklasse kalt CalculatorProgram. Her skal du spørre brukeren om hvilken type kalkulator som skal brukes og kjører denne med input og output. Husk at en underklasse subklasse kan også brukes som overklassensuperklassen. Et felt av type Calculator SimpleCalculator kan være både en SimpleCalculator og en RPNCalculator. Bruk dette ved å f.eks. sette SimpleCalculator calc = new SimpleCalculator(); eller SimpleCalculator calc = new RPNCalculator(); avhenging av hvilket valg brukeren tar.

Exercise-panelet

Bruk av Exercise-panelet er obligatorisk for denne øvingen. Du må ha panelet åpent med CalculatorInheritance.ex-filen (tests > objectstructures CalculatorInheritance.ex) i før du begynner med oppgaven. For mer informasjon/hjelp, se nederst på forrige side, altså hovedsiden for Øving 9.

 

Include Page
Bunntekst for oppgaver
Bunntekst for oppgaver