Springen naar inhoud

[java] vraag over subklassen en overerving/riding


  • Log in om te kunnen reageren

#1

wesleyc

    wesleyc


  • >25 berichten
  • 99 berichten
  • Ervaren gebruiker

Geplaatst op 16 november 2011 - 16:42

Ik ben voor mijn opleiding Technische Wiskunde in Delft bezig met Java, we zijn begin dit jaar begonnen en nu aangekomen bij overerving etc.

De bedoeling is dat ik Strings kan invoeren, die of:
- slechts bestaan uit 1 token ( bijv. 'aaaa')
- een combinatie van tokes zijn met een bepaalde operator (C of R) ( bijv. '( aaaa C bbb )' , maar ook '( ( aaa R bb ) C zzz )' )

Om hier mee om te kunnen gaan is het de bedoeling om een Superklasse ( Ex ) en twee subklassen (SimEx en BinEx) te creeeren. SimEx regelt de 1 token Strings en BinEx de combinaties.
BinEx is een combinatie van een SimEx + operator + SimEx

Er is gebruik gemaakt van een scanner om een Expressie in te lezen.

Mijn programma waarin Ex.java wordt aangeroepen is dit:

import java.util.*;

public class Opdracht7_1{

public static void main(String[] args){


Scanner sc = new Scanner(System.in);
Ex exp = Ex.read(sc);
System.out.println(exp.eval().toString());
}
}


Mijn Ex.java ziet er nu zo uit:

import java.util.*;

public abstract class Ex{
//inhoud van klasse Ex
public abstract String eval();


public static Ex read(Scanner sc){
if(sc.next().equals("(")){
Ex s1 = read(sc);
char op1 = sc.next().charAt(0);
Ex s2 = read(sc);
sc.next();
BinEx bi = new BinEx(s1,op1,s2);
return bi;
}
else{
SimEx s3 = new SimEx(sc.next());
return s3;
}
}

}


//SIMEX KLASSE ---------------------------------
class SimEx extends Ex{

private String tekst;

public SimEx(String tk){
tekst = tk;
}

public String eval(){
return tekst;
}

public String toString(){
String res = "<SimEx(";
res = res + tekst + ")>";
return res;
}
}


//BINEX KLASSE -----------------------------------
class BinEx extends Ex{

private Ex operand1;
private Ex operand2;
private char operator;

public BinEx(Ex s1, char op, Ex s2){
operand1 = s1;
operand2 = s2;
operator = op;
}

public String eval(){
if( operator == 'C'){
return operand1.eval() + operand2.eval();
}
else{
return operand2.eval() + operand1.eval();
}
}

public String toString(){
String res = "<BinEx(";
res = res + operand1 + "," + operator + "," + operand2 + ")>";
return res;
}
}


Alles Compiled maar als ik uitvoer kan ik typen wat ik wil, er komt niks uit ;)

Ergens zit er een foutje in maar ik ben de draad even kwijt, heb al me boek erbij gepakt en op internet gezocht maar het wil niet echt. Wie o wie kan mij helpen?

Belangrijk: We moeten veel dingen nog op de primaire manier doen, we mogen dus geen fancy opties gebruiken om lappen script te skippen :P

Veranderd door Xenion, 25 december 2011 - 21:00


Dit forum kan gratis blijven vanwege banners als deze. Door te registeren zal de onderstaande banner overigens verdwijnen.

#2

ZVdP

    ZVdP


  • >1k berichten
  • 2097 berichten
  • VIP

Geplaatst op 16 november 2011 - 17:38

Het is een kleinigheidje:
public static Ex read(Scanner sc)
	{
		String next=sc.next();
		if(next.equals("("))
		{
			Ex s1 = read(sc);
			char op1 = sc.next().charAt(0);
			Ex s2 = read(sc);
			sc.next();
			BinEx bi = new BinEx(s1,op1,s2);
			return bi;
		}
		else{
			SimEx s3 = new SimEx(next);
			return s3;
		}
	}

Zie je wat er eerder verkeerd ging?

En mocht je ooit zoiets nodig hebben in een while-loop, dan kan je ook de volgende syntax gebruiken:
String next;
while ((next=sc.next()).equals('(') )
{
   // do something with next   	
...
}

Verder nog een aantal kleinigheden ivm met het aanmaken van onnodige tussenvariabelen:

BinEx bi = new BinEx(s1,op1,s2);
return bi;

wordt simpel
return new BinEx(s1,op1,s2);

public String toString(){
	String res = "<SimEx(";
	res = res + tekst + ")>";
	return res;
}
wordt
public String toString(){
	return "<SimEx(" + tekst + ")>";
}
of als je er wat meer structuur in wil aanbrengen
return "<SimEx(" + 
		tekst + 
		")>";
"Why must you speak when you have nothing to say?" -Hornblower
Conserve energy: Commute with a Hamiltonian

#3

wesleyc

    wesleyc


  • >25 berichten
  • 99 berichten
  • Ervaren gebruiker

Geplaatst op 16 november 2011 - 17:47

:P
Ik wist dat het een kleinigheid moest zijn, maar dat dit het was :P

Hartstikke bedankt, ik heb mijn programma net gerund en het werkte ;)

#4

ZVdP

    ZVdP


  • >1k berichten
  • 2097 berichten
  • VIP

Geplaatst op 16 november 2011 - 18:02

Het zijn altijd de kleinigheden waarnaar je het langst moet zoeken; des te groter de fout, des te harder ze typisch opvalt.

Ik heb ooit heel lang moeten zoeken naar waarom volgende code maar 1 keer "test" print ipv 10 keer:
for (int i=0;i<10;i++);
{
	 System.out.println("test");
}
En als je het dan eenmaal vindt, dan vraag je je af waarom het zo lang geduurd heeft vooraleer je zo'n stomme, en soms zelfs niet eens subtiele, foutjes vindt.
"Why must you speak when you have nothing to say?" -Hornblower
Conserve energy: Commute with a Hamiltonian

#5

wesleyc

    wesleyc


  • >25 berichten
  • 99 berichten
  • Ervaren gebruiker

Geplaatst op 16 november 2011 - 22:38

Het zijn altijd de kleinigheden waarnaar je het langst moet zoeken; des te groter de fout, des te harder ze typisch opvalt.

Ik heb ooit heel lang moeten zoeken naar waarom volgende code maar 1 keer "test" print ipv 10 keer:

for (int i=0;i<10;i++);
{
	 System.out.println("test");
}
En als je het dan eenmaal vindt, dan vraag je je af waarom het zo lang geduurd heeft vooraleer je zo'n stomme, en soms zelfs niet eens subtiele, foutjes vindt.

ik moest ook even zoeken ;)

Hier mag een slotje op

Veranderd door wesleyc, 16 november 2011 - 22:38


#6

In physics I trust

    In physics I trust


  • >5k berichten
  • 7384 berichten
  • Moderator

Geplaatst op 16 november 2011 - 23:25

Haha, dat was subtiel ;) Voor zij die het niet zagen:

Verborgen inhoud

for (int i=0;i<10;i++);
{
System.out.println("test");
}

"C++ : Where friends have access to your private members." — Gavin Russell Baker.





0 gebruiker(s) lezen dit onderwerp

0 leden, 0 bezoekers, 0 anonieme gebruikers

Ook adverteren op onze website? Lees hier meer!

Gesponsorde vacatures

Vacatures