[java] vraag over subklassen en overerving/riding
-
- Berichten: 99
[java] vraag over subklassen en overerving/riding
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
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
- Berichten: 2.097
Re: [java] vraag over subklassen en overerving/riding
Het is een kleinigheidje:
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:
Verder nog een aantal kleinigheden ivm met het aanmaken van onnodige tussenvariabelen:
wordt simpel
wordt
of als je er wat meer structuur in wil aanbrengen
Code: Selecteer alles
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;
}
}
En mocht je ooit zoiets nodig hebben in een while-loop, dan kan je ook de volgende syntax gebruiken:
Code: Selecteer alles
String next;
while ((next=sc.next()).equals('(') )
{
// do something with next
...
}
Code: Selecteer alles
BinEx bi = new BinEx(s1,op1,s2);
return bi;
Code: Selecteer alles
return new BinEx(s1,op1,s2);
Code: Selecteer alles
public String toString(){
String res = "<SimEx(";
res = res + tekst + ")>";
return res;
}
Code: Selecteer alles
public String toString(){
return "<SimEx(" + tekst + ")>";
}
Code: Selecteer alles
return "<SimEx(" +
tekst +
")>";
"Why must you speak when you have nothing to say?" -Hornblower
Conserve energy: Commute with a Hamiltonian
Conserve energy: Commute with a Hamiltonian
-
- Berichten: 99
Re: [java] vraag over subklassen en overerving/riding
Ik wist dat het een kleinigheid moest zijn, maar dat dit het was
Hartstikke bedankt, ik heb mijn programma net gerund en het werkte
- Berichten: 2.097
Re: [java] vraag over subklassen en overerving/riding
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:
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 heb ooit heel lang moeten zoeken naar waarom volgende code maar 1 keer "test" print ipv 10 keer:
Code: Selecteer alles
for (int i=0;i<10;i++);
{
System.out.println("test");
}
"Why must you speak when you have nothing to say?" -Hornblower
Conserve energy: Commute with a Hamiltonian
Conserve energy: Commute with a Hamiltonian
-
- Berichten: 99
Re: [java] vraag over subklassen en overerving/riding
ik moest ook even zoekenZVdP schreef: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:
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.Code: Selecteer alles
for (int i=0;i<10;i++); { System.out.println("test"); }
Hier mag een slotje op
- Berichten: 7.390
Re: [java] vraag over subklassen en overerving/riding
Haha, dat was subtiel Voor zij die het niet zagen:
Verborgen inhoud
"C++ : Where friends have access to your private members." Gavin Russell Baker.