Generische Klasse

bluebaby

Aktives Mitglied
Hallo,
Ich komm mal wieder nicht bei meiner Aufgabe weiter, ich hoffe ihr könnt mir vielleicht helfen.

Aufgabenstellung: Quiz-Klasse und schreibe anschließend den Quellcode. Dabei soll zu einer Frage, die immer ein String ist, eine beliebige Antwort-Art zugeordnet werden können (z.B. wieder Texte als Antwort oder ganze Zahlen oder auch Dezimalzahlen oder vielleicht auch Farben, Daten, etc.). Die Klasse Quiz soll dazu intern eine Map verwenden, die die Fragen als Schlüssel verwendet. Weiters soll die Quiz-Klasse folgende Methoden besitzen:
frageHinzu: Fügt eine Frage mit einer passenden Antwort zum Fragenpool dazu
zufallsFrage: Wählt zufällig eine Frage aus und gibt sie zurück
antwortCheck: überprüft, ob das als Parameter übergebene Frage-Antwort-Paar mit einem gespeicherten Frage-Antwort-Paar übereinstimmt. Wenn die Antworten gleich sind, gib true zurück, sonst false.
frageLoeschen: Löscht eine als Parameter übergebene Frage mit der zugehörigen Antwort aus der Map
fragenListe: speichert alle in der Map gespeicherten Fragen mit den zugehörigen Antworten in einen String und gibt diesen zurück.

Schreibe nun zwei verschiedene Quiz-Programme, die diese Quiz-Klasse verwenden. Die beiden Programme sollen unterschiedliche Datentypen für die Antworten verwenden.


Ich verstehe nicht ganz was zB.: die Methode hinzufügen machen soll, soll die in der Map gespeichert werden ? und was soll ich zurückgeben?. Weiters verstehe ich nicht ganz wie ich das mit der Antwort lösen soll <T> ist ja eine Typvariable und man soll ja verschiedenst Antworten können also nicht nur mit einem String.

Das habe ich daweil:

Java:
import java.util.*;

public class Quiz<T> {
	

	private T value;
	
	
	TreeMap <String, T>tMap = new TreeMap<String, T>();
	
	
	public void frageHinzu(String a){
		
		tMap.put(a,value);
		T var=tMap.get(a);
		T var2=tMap.get(value);
		
		
		
		}
	   
	}

Ich hoffe ihr könnt mir helfen,
bluebaby
 
Schreibe nun zwei verschiedene Quiz-Programme, die diese Quiz-Klasse verwenden. Die beiden Programme sollen unterschiedliche Datentypen für die Antworten verwenden.


Ich verstehe nicht ganz was zB.: die Methode hinzufügen machen soll, soll die in der Map gespeichert werden ? und was soll ich zurückgeben?. Weiters verstehe ich nicht ganz wie ich das mit der Antwort lösen soll <T> ist ja eine Typvariable und man soll ja verschiedenst Antworten können also nicht nur mit einem String.
So wie ich das verstanden habe, soll eine konkrete Implementierung der Quizklasse aber nur Antworten eines bestimmten Typs zu lassen. Somit würde ich die Klasse Quiz abstract machen und die geforderten Methoden nur als abstracte Methodenrümpfe definieren, die dann erst in den zwei konkreten Klassen implementiert werden.
 
Ich habe jetzt versucht die Klasse Quiz zu schreiben:

Java:
import java.util.*;

abstract class Quiz<T> {
	

	private T value;
	
	TreeMap <String, T>tMap = new TreeMap<String, T>();
	
	
	
	public abstract void frageHinzu(String a,T value);
	
	
	public abstract void zufallsFrage(String b);
	
	
	public abstract boolean antwortCheck(String a,T value);
	
	
	public abstract boolean frageLoeschen(String c,T value);
	
	public abstract String fragenListe();
	
	
}


Könnte das so stimmen und wie kann ich jetzt die Methoden in den beiden anderen Klassen verwenden?
bluebaby
 
Ich seh die Aufgabenstellung anders. Ich würde sie soh interpretieren, das es eine generische, aber nicht abstrakte Klasse Quiz<T> gib und zwei Klassen, die diese Klasse mit unterschiedlicher Typisierung nutzen. Ein bsp für eine solche Klasse:

Java:
public class QuizTest1
{

public static void main(String args[])
{
    Quiz<Integer> quiz=new Quiz<Integer>();
    quiz.put("Was ist der Sinn des Lebens",42)
    //noch mehr put...
    
    Scanner sc=new Scanner(System.in);
    int richtig=0;
    for(int i=0;i<10;i++)
    {
         String frage=quiz.zufallsFrage();
         System.out.println(frage);
         int antwort=sc.nextInt(); 
         if(antwortCheck(frage,antwort)) richtig++;
         quit.frageLöschen(frage);
    }
    System.out.println( (richtig/10.0) +"% richtige Antworten");
}

}
 
Ich seh die Aufgabenstellung anders. Ich würde sie soh interpretieren, das es eine generische, aber nicht abstrakte Klasse Quiz<T> gib und zwei Klassen, die diese Klasse mit unterschiedlicher Typisierung nutzen. Ein bsp für eine solche Klasse:
dein bsp zeigt nicht eine implementierung der klasse, sondern nur ihre Verwendung. Und ob nun Quiz<T> abstract ist oder nicht - die Aufgabenstellung loest ihr beiden damit.

Aber es stimmt schon, dass bei der Aufgabenstellung an sich es noch keinen Sinn macht eine abstrakte Klasse einzufuehren. Wenn es nur um untersch. Typisierungen geht reicht hier eine simple implementierung... es gibt ja auch nicht eine StringArrayList, IntegerArrayList etc...
 
Ich sehe ein Problem mit der Verwendung von [c]TreeMap<T>[/c] für einen Typ [c]T[/c], der nicht [c]Comparable<T>[/c] ist. Die Doku sagt zur Verwendung des parameterlosen Konstruktors:

public TreeMap()

Constructs a new, empty tree map, using the natural ordering of its keys. All keys inserted into the map must implement the Comparable interface.

Die einfachste Lösungsmöglichkeit wäre, stattdessen eine [c]HashMap[/c] zu verwenden. Alternativ könnte man den Typ [c]T[/c] entsprechen beschränken: [c]public class Quiz<T extends Comparable<T>> { ...[/c]
 

Neue Themen


Zurück
Oben