Java Einstellen von attributen

FreddyMercury

Rear Admiral
Registriert
Dez. 2002
Beiträge
5.414
Hi Leute,

ich hab hier was komisches mit Java.

Ich hab folgende Methode: setStringProperties( String prop );
In dieser Methode soll ich einstellen, was die klasseneigene toString Methode an eigenschaften ausdrucken soll.

Also mache ich z.B. Person p = p. setStringProperties(Person.FirstName + "," + Person.LastName + "," + "No." + "," + "PlayerNumber" + "," + " (" + "," + "Position" + "," + )" );

System.out.println(p);

Dann soll folgendes stehen: Freddie Mercury #1 Player 15 ( Right Wing )

Ich hab schon mal was angefangen, aber alles was ich rausbekomme ist der code der auch dann in der setStringProperties drinsteht.

Person.FirstName und Person.LastName bleiben uebrigens static.

Hat jemand irgendwelche Ideen?

Danke schon im Vorraus,

FreddyMercury
 
Warum ueberschreibst du nicht einfach die toString methode selbst?

Code:
@Override
public void toString() {
return "Person.FirstName + "," + Person.LastName + "," + "No." + "," + "PlayerNumber" + "," + " (" + "," + "Position" + "," + )";
}

Waere doch einfacher?
 
Könntest du mal den Code für die Klasse Person posten?

Im Moment sieht es ja so aus als dass die Methode setStringProperties eine Person zurückliefert.

Ansonsten musst du die toString Methode überschreiben, da diese bei System.out.println() abgefragt wird.

Also quasi:

Code:
public class Person{
   private String prop;
   (...)
   public void setStringProperties( String p){
     this.prop = p;
   }

   public String toString(){
     return prop;
   }
}

Edit:
@tarsonis
Ginge auch, aber die Intention dahinter ist wohl die toString Methode variabel zu halten. So könnte man zu einem späteren Zeitpunkt die Ausgabe ändern ohne großartig am Code zu frickeln.
P.S. der Rückgabewert muss vom Typ String sein für toString.
 
Zuletzt bearbeitet:
Kann ich nicht machen, da die Person class die Super class ist und 4 andere klassen expanden die Person class. Und die anderen klassen fuegen dann noch eigene Sachen hinzu. Ausserdem muss die Person toString methode entscheiden je nach Attribut was ausgegeben wird und was nicht. Z.B. kommt bei manchen Leuten ein Titel hinzu. Das waere dann von einer anderen klasse. Doctor.Title. Wobei Title ein String ist und der aber nicht immer im code vorkommt, wenn der Doctor aufgerufen wird.

Ohne Attribute:
Z.b.: Doctor Freddie Mercury

Mit Attributen:
Z.b.: Freddie Mercury #1 Player 15 ( Right Wing )
 
Zuletzt bearbeitet:
So wie ich das geschrieben habe sollte es auch für eine abstrakte Klasse gehen, da die den Wert von prop ja ändern kannst in der erbenden Klasse.
 
Wie waers du ueberlaedst noch die toString() Methode, dass sie Parameter akzeptiert und nimmst die abstrakte Klasse Person als Parameter und fraegst dann per if ab welchen Typ das Objekt hat das du da reinlaedst? Oder du rufst super.toString auf und appendest was du benoetigst.
 
Poste doch mal deinen Code bitte. Bei mir gehts wunderbar so wie ich es gepostet habe, eben kurz getestet.

@tarsonis
Das geht nicht. Man kann nicht die Signatur von toString ändern, da es eine supertype Methode ist. Die muss man schon so lassen.

Schau, so könnte eine mögliche Lösung aussehen:

Code:
public abstract class Person {
	private String prop;
	private String name;
	private String nachname;
	private int no;
	
	protected Person( String name, String nachname, int no ){
		this.name = name;
		this.nachname = nachname;
		this.no = no;
		setStringProperties( name+nachname+no );
	}
	
	protected void setStringProperties( String p ) {
		this.prop = p;
	}
	
	@Override
	public String toString() {
		return prop;
	}

	
	public static void main(String[]_) {
		Person p1 = new Person2( "samotyr ","rytomas ",42," Sturm" );
		Person p2 = new Person3( "Freddy ","Mercury ", 41 );
		
		System.out.println( "Person2: " + p1 +"\nPerson3:"+p2 );
		
		p1.setStringProperties( p1.name+p1.nachname+"usw." );
		System.out.println( p1 );
	}
}

Person2
Code:
public class Person2 extends Person{
	private String posi;

	public Person2( String name, String nachname, int no, String posi ) {
		super( name, nachname, no);
		this.posi = posi;
	}

}

Person3
Code:
public class Person3 extends Person{

	protected Person3(String name, String nachname, int no) {
		super(name, nachname, no);
	}	
}


Ergebnis:
Person2: samotyr rytomas 42
Person3:Freddy Mercury 41
samotyr rytomas usw.
 
Zuletzt bearbeitet:
Direkt code kann ich leider nicht geben, aber ich kann folgendes machen:

Team heimTeam = new Team("Queen");
Person p = person.remove(0);

p.addPropertie( "Position", "Torwart" );
heimTeam.add(p);
p.setStringPropertie( Person.FirstName, + "," + Person.LastName + "," + "No." + "," + "PlayerNumber" + "," + " ( " + "," + "Position" + "," + ") " );

So wenn ich ab hier das heimTeam mit einem Array iterate, dann sollte die "public final static String FirstName = "FirstName";" mit dem Vornamen ersetzt werden. Das gleiche mit Person.LastName. Die kommas werden komplett von der Methode rausgenommen und nur als zwischenschritt fuer das Programm angesehen um zu Signalisieren, das da gleich was anderes kommt. Der rest erklaert sich hoffentlich von selber.

Das setStringProperties ist uebrigens public und soll es auch bleiben. Da soll nichts protected sein in dem Code. Sinn des ganzen soll sein, dass man Attribute mit Namen on-the-fly hinzufuegen und auch loeschen kann.
 
Nichts fuer ungut, aber das was du lieferst trägt nicht umbedingt dazu bei dir zu helfen.
Außerdem sieht es für mich irgendwie so aus als ob du das Konzept der Objekt-Orientierung leicht missverstanden hast.

Warum solltest du von außen die toString() ausgabe ändern wollen? Wenn du verschiedene Darstellungen von einer Person haben willst, dann implementier doch einfach in der Superklasse toString() und toStringAnders() und toStringNochmalAnders(). Dann musst du auch in deinem aufrufenden Code nicht jedes mal die Stringausgabe anpassen.

Letztendlich willst du ja nichts anderes als die Repräsentation des Person anpassen. Da aber die Repräsentation eines Objektes am Objekt liegen sollte und nicht am Code-Fragment das die Repräsentation erwartet, ist dein Ansatz wohl kaum OO geeignet.

Willst du es trotzdem umbedingt so machen, dann empfehle ich dir in deiner setStringGedöns() auf Platzhalter zurückzugreifen und dann mit String-Methoden die Platzhalter in der toString()-Methode mit den eigentlichen Werten aus der Klasse zu überschreiben.
Code:
public String toString() {
return this.prop.replace("[name]", this.name).replace("[alter]",this.alter);
}

Its not that hard.
 
KK habs hinbekommen. Thx fuer die Hilfe erstmal.

Hab nen String erstellt mit werten von einem Compulsory Object und die Werte hab ich dann in einen anderen String uebergeben, der in der toString methode erstellt wird. Dann durch eine Hashmap iterated in der dann in dem neuen String die Werte mit replaceAll ersetzt werden.
 
Zurück
Oben