Zum Forum springen
Benachrichtigungen
Alles löschen

[Geschlossen] kurze hilfe JAVA gesucht

30 Beiträge
11 Benutzer
0 Reactions
1,534 Ansichten
HeinekenMD
Beigetreten: 27.02.2007

hey, muss an der uni ein assignment anfertigen. es geht um java.

ich habe eine superklasse MEDIUM, darunter 5 subklassen (cd, dvd, blueray,...)
dann gibt ne klasse KATALOG mit dem

datenfeld:
private ArrayList<Medium> medien

konstruktor:
public Katalog()
{
medien = new ArrayList<Medium>();
}

methode um ein Medium in den katalog einzuführen:
public void erfasseMedium (Medium neumedium)
{
medien.add(neumedium);
}

soweit so gut. jetzt möchte durch eine methode alle medien, welche im Katalog sind ausgeben:
public void ausgeben()
{
for (Medium alle : medien)
{ alle.auflisten();
System.out.println();
}

das gibt jetzt wie gesagt alle medien aus, also cds, dvds, bluerays usw. wie kann ich jetzt explizit nur z.b. cds ausgebenn???
die methode auflisten ist ja in allen subklassen und auch in der superklasse schon drin, das sieht dann für cds so aus:

public void auflisten()
{ System.out.println("##################");
super.auflisten();
System.out.println("Künstler: " + kuenstler);
System.out.println("Titelanzahl: " + anzahltitel);
}

ich brauch also ne methode
private void ausgeben (?????), wo ich über den parameter bestimme, dass ich jetzt nur cds, nur dvds usw. ausgeben möchte.

is wahrscheinlich ziemlich einfach, aber ich komm nich drauf.

thanks


29 Antworten
ABKaliasHORST
Beigetreten: 17.12.2008

instanceof

http://www.dpunkt.de/java/Die_Sprache_Java/Objektorientierte_Programmierung_mit_Java/48.html

public void nurCDsAusgeben()
{
for (Medium alle : medien)
{
if( alle instanceof CD)
alle.auflisten();
System.out.println();
}


Ich glaube mein Ansatz ist ziemlich dirty:

if( alle instanceof type)

wie genau instanceof geschrieben wird sagt dir eclipse :)

#edit

too slow :)


HeinekenMD
Beigetreten: 27.02.2007

okay, das es irgendwie über instanceof gehen muss, hab ich mir gedacht.

aber so bräuchte ich ja wieder mehrere methoden, quasi für jede klasse (cd, dvd,..) eine ausgabenfunktion, oder?

ich hätte am liebsten eine ausgabefunktion in der klasse Katalog, wo ich als parameter eingebe: cd und es wird alles ausgegeben, was von der klasse cd ist.

btw danke schonmal =)


HeinekenMD
Beigetreten: 27.02.2007

also in der aufgabenstellung steht, die mthode soll irgendwie so aussehen:

private void ausgeben (Medium medium), aber damit krieg ich es nicht auf die reihe ?(


HeinekenMD
Beigetreten: 27.02.2007

quasi so:

public void nurXXXAusgeben(xxx)
{
for (Medium alle : medien)
{
if( alle instanceof xxx)
alle.auflisten();
System.out.println();
}


fightorflight
Beigetreten: 15.03.2007

versuch das mal:

private void ausgeben(Medium m) {
for (Medium x : medien) {
if (x.getClass() == m.getClass()) {
System.out.println(x.name);
}
}
}


HeinekenMD
Beigetreten: 27.02.2007

okay, das funktioniert schon fast.
problem ist, dass ich hier als parameter (Medium m) hier nicht die klasse CD eingeben kann und er mir alle CDs ausgibt, sondern ich gebe hier ein Objektnamen ein, beispielsweise CD1 und dann gibt er mir alle CDs richtig aus.

ich möchte aber nicht ein spezielles Objekt eingeben, sondern direkt die Klasse ?(

so sieht es jetzt aus:

ich hab jetzt mal 2 cds, eine dvd und ein spiel. jetzt möchte ich als methode im katalog gern, dass ich "CD" eingebe und dann CD1 und CD2 ausgegeben werden, bzw. ich gebe "Videospiele" ein und es wird Spiel1 ausgegeben.

jetzt ist es so, dass ich "CD1" eingeben muss und CD1 und CD2 ausgegeben werden.


fightorflight
Beigetreten: 15.03.2007

jetzt bekommt ausgeben einen string übergeben wenn der so ist wie die klasse heißt gibt er die elemente aus

wenn deine Klasse Cd heißt musst du medien.ausgeben("Cd"); aufrufen.

private void ausgeben(String m) {
	for (Medium x : medien) {
		if (x.getClass().getName().equals(m)) {
			System.out.println(x.name);
		}
	}
}

HeinekenMD
Beigetreten: 27.02.2007

ja okay danke, über string gehts natürlich auch.


ameisenmann
Beigetreten: 01.12.2007

Poste doch mal die Klasse Medium. Vielleicht steht da schon eine Eigenschaft drin, über die man feststellen kann, was es ist.

Laut dieser Vorgabe hier musst Du aber ein Objekt wie cd1 übergeben:

private void ausgeben (Medium medium)

Ist dieser methodenkopf vorgegeben?
Wenn ja, ist die Lösung mit getClass() dock ok.

Ich meine, wie soll denn die Klasse Katalog wissen, welche Medienarten alles möglich sind? Das soll ja offen bleiben, wenn in Zukunft was Neues hinzu kommt. daher wäre eine Überprüfung mit instanceof schon dirty.

Wobei wirklich sinnig finde ich es auch nicht, ihm da ein Objekt rein zu geben.

Ich hätte in Medium eine Eigenschaft
int medientyp
erstellt, die dann im Konstruktor von den spezifischen geerbten Medienarten gesetzt wird. Z.B. 1 für CD, 2 für DVD etc.

In der Methode ausgeben(int medienart) könntest du dann in der schleife diesen wert abprüfen, um nur einen medientyp auszugeben.
mit einem if fragt man das dann einfach ab.
hier könnte man durch eingabe einer 0 zb auch alle ausgeben lassen. indem man folgendes prüft:

private void ausgeben(int m)
{
   for (Medium x : medien) 
   {
        if (x.getMedienart() == m or m == 0) 
        {    
              System.out.println(x.getName());
        }
    }  
}

Um sich nicht die ganzen Zahlen merken zu müssen, kann man auch im Katalog statische, unveränderbare Eigenschaften einführen, die sich auch unkompliziert erweitern lassen.

public static final int ALLE = 0;
public static final int CD = 1;
public static final int DVD = 2;
usw.

beim Aufrufen kannst Du dann schreiben

katalog.ausgeben(Katalog.CD);

edit: hatte beim code einen fehler. ist verbessert


HeinekenMD
Beigetreten: 27.02.2007

cool danke =)

ich frag morgen mal beim dozenten nach, wie genau er das mit ausgeben (Medium medium) gemeint hat. wie schon gesagt, muss man hier eigentlich immer ein objekt übergeben, was aber nicht so wirklich sinnvoll ist.


BigBiber
Beigetreten: 17.09.2006

Sonst probier doch mal:

public static final Medium = new Medium(); // wenn nicht abstract!
public static final CD = new CD();
public static final DVD = new DVD();
...

//dann hier..

public void ausgeben(Medium m){

     if(m instanceof Medium){
        //hier alle ausgeben
       return; //wichtig!
    }else{
       //hier feinere Unterteilung 
    }
}

Wenn es so sein soll sonst ist die int-Variante eleganter


sarc
Beigetreten: 06.06.2008

Der Code mit getClass() war doch schon fast was du haben willst... Wenn dir das nicht gefällt, dass du ne Instanz brauchst:

private void ausgeben(Class typ) {
  for (Medium x : medien) {
    if (x.getClass() == typ) {
      ...
    }
  }
}

Aufgerufen wird das dann zum Beispiel ausgeben(CD.class)


BigBiber
Beigetreten: 17.09.2006

.


B4sti
Beigetreten: 16.10.2007

Du könntest auch in Medium die Methoden

public boolean isCD(){
  return false;
}

public boolean isDVD(){
  return false;
}

...

...

erstellen und dann in der jeweiligen Klasse die passende Methode wieder überschreiben.

Bsp. für die Klasse CD:

@Override
public boolean isCD(){
  return true;
}

Und dann kannst du in der ausgeben Methode fragen

if (medium.isCD()){
   print("WHATEVER");
}

sarc
Beigetreten: 06.06.2008

Objektorientierter Entwurf ftw! Ich empfehle dann aber, zur Zukunftssicherheit noch die Methoden isNewSubtypeIWillAddEventually1 bis 9 sowie isNewSubtypeIWantToAddTooButRanOutOfDigits hinzuzufügen.

Zur Übersetzung: Die von B4sti vorgeschlagene Methode funktioniert, bricht aber mit der Objektorientierung, da da die Oberklasse genauere Kenntnisse über ihre Unterklassen haben müsste. Dann kann man auch direkt alles da reinbauen.


B4sti
Beigetreten: 16.10.2007

Joa, des stimmt wohl.
Aber über getClass() finde ich es immer nicht so schön gelöst.

Dann könnte man es noch so machen:

In Medium

public String ausgeben(String parameter);

in z.B. CD:

public String ausgeben(String parameter){
  if(paramter.equals("CD") || parameter.equals("")){
    return this.getName();
  }
  return "";
}

Dann würde mit

medium.ausgeben("CD");

nur was zurückgegeben werden, wenn es auch wirklich eine CD ist.
So wird der Name der CD nur ausgegeben wenn keine Einschänkungen über den Parameter übergeben werden, oder wenn explizit CD als Einschränkung angegeben wird.

Allerdings muss der Aufrufer dann irgendwoher wissen, dass mann "CD" eingeben muss, wenn man CDs sehen will. Aber das kann man ja in der Doku verewigen


sarc
Beigetreten: 06.06.2008

Willst du dann jeder Klasse ne getName-Methode verpassen oder doch getClass().getName() verwenden? ;)


B4sti
Beigetreten: 16.10.2007

Naja, die Methode muss halt das liefern was gewünscht ist.
Man kann da ja auch

getKuenstler() + getTitle()

ausgeben.
Was auch immer gefordert ist.
Den Klassennamen auszugeben ist wahrscheinlich nicht gewünscht ;)