Eigenschaftswerte festlegen/Klasse/Objekt

zlFavourite

Aktives Mitglied
Hallo, ich möchte ein kleines Consolen Spiel schreiben um mit der Programmierung anzufangen. Bei meinem Spiel habe ich eine Klasse Waffe. Von dieser Klasse erben weitere Klasse (z.B. Klasse Schwert). Nun möchte ich der Schwert Klasse Werte zuweißen. Jedes Schwert, soll die gleichen Werte haben. Wie würde ich das machen ?


PS. Ich habe es aktuell anders gelöst: Aktuell weiß ich die Werte in der Waffen Klasse zu, was aber ein Denkfehler von mir war. Jedoch hab ich da auch noch eine Frage. Ich habe da meine Werte zugewiesen und wenn ich ein Schwert Obj initialisiere braucht das trotzdem nochmal eigene Werte? Wieso, ich habe ja eigentlich die Werte in der Waffen Klasse festgelegt.
Ich lade hier mal meinen Code hoch. Vielen Dank für eure Hilfe.

[CODE lang="csharp" title="Waffen/Schwert Klasse"]public abstract class Waffe
{
public double Haltbarkeit { get; set; } = 100;
public double Schaden { get; set; } = 5;
public int Reichweite { get; set; }
public string Gewichtsklasse { get; set; } = "A";
public int Trefferchance { get; set; } = 1;

public Waffe(double Haltbarkeit, double Schaden, int Reichweite, string Gewichtsklasse, int Trefferchance)
{
this.Haltbarkeit = Haltbarkeit;
this.Schaden = Schaden;
this.Reichweite = Reichweite;

this.Gewichtsklasse = Gewichtsklasse;
this.Trefferchance = Trefferchance;
}
}

public class Schwert : Waffe
{
public Schwert(double Haltbarkeit, double Schaden, int Reichweite, string Gewichtsklasse, int Trefferchance) : base(Haltbarkeit, Schaden, Reichweite, Gewichtsklasse, Trefferchance)
{
}

}[/CODE]

[CODE lang="csharp" title="Form1 Klasse"] Schwert schwert = new Schwert(10,5,5,"a",5);
[/CODE]
 
K

kneitzel

Gast
Also jede Waffe braucht diese Attribute und Du hast ja unterschiedliche Schwerter. Ein gutes Schwert mit besseren Werten und ein einfaches Schwert mit weniger guten Werten z.B.

Daher musst Du bei der Erstellung Attribute angeben.

Rein technisch ist es schlicht so, dass Du das angeben musst, was Du im Konstruktor vorgegeben hast. Du hast jetzt nur einen Konstruktor, bei dem Du Werte angeben musst. Aber du kannst natürlich noch weitere Konstruktoren anlegen. Wenn Du noch einen Konstruktor schreibst, der keine Parameter nimmt, dann kannst Du ein Schwert auch entsprechend anlegen:
C#:
Schwert schwert = new Schwert();

Aber die Frage, ob dies so Sinn macht, kannst nur Du entscheiden, denn Du weisst, was Du wie machen willst in Deiner Applikation.

Und bezüglich C# ggf. noch der Hinweis auf die MSDN Foren - da ist man in der Regel besser aufgehoben mit c# Fragen als in einem Java Forum.
(Ich nehme mal an, dass es C# ist - der Code sieht zumindest danach aus bezüglich Properties und so :) )
 

White_Fox

Top Contributor
Wie stark ausgefeilt willst du das Ganze denn haben?

Klar...du könntest jedes Mal alle beliebigen Werte im Konstruktor übergeben. Dann kannst du an jeder Stelle deines Programms laufend beliebig verschiedene Schwerter erzeugen, ich persönlich fände das aber nicht gerade gut.
Eigentlich will man da doch ein paar wohldefinierte und in ihren Werten ausbalancierte Schwerter unterschiedlicher Klassen (ich meine sowas wie "Einfaches Bauernschwert", "Rostiges und stumpfes Ritterschwert", "Goldenes Ritterschwert", aber nicht daß was man in Java unter einer Klasse versteht) haben.

Auch auf die Gefahr hin daß ich hier wieder Haue wegen übertriebener OOP bekomme:
Ich würde die verschiedenen gewünschten Schwertklassen in einer Enumeration abbilden. Du kannst da Einträge für einfache Bauernschwerter oder König Arthurs Drachenbändiger erstellen. Und: du kannst einer Enumeration weitere Eigenschaften hinzufügen, so daß jeder Enumerationseintrag andere Werte für Schaden, Geschwindigkeit (oder was du sonst für Schwertcharakteristika hast).
Und im Konstruktor übergibst du einfach einen Enumerationswert, und der Schwertkonstruktor zieht sich die Werte aus dem Enumerationswert.
Und brauchst dann keine verschiedenen Code-Klassen, sondern einfach nur eine einzige public class Sword.

Warum ich das so lösen würde: Es entsteht meiner Meinung nach sehr angenehm zu lesender und sich selbstdokumentierender Quellcode. Neue Schwertklassen (also die Schwerter an sich, keine Codeklassen) kannst du zentral an einer Stelle (nämlich in der Enumerationsklasse) erstellen, und bestehende Schwertklassen auch leicht ändern, und hast dazu eine gute Übersicht weil du alles zusammen in einer Datei hast.
Und du kannst auch sehr leicht zufällig eine Schwertklasse erzeugen: Enumerationen können als Array geliefert werden, und da mußt du dir einfach nur noch zufällig eine Enumeration geben lassen.

PS: Ich sehe jetzt erst daß es nicht um Java geht, von C# habe ich aber keine Ahnung. Wahrscheinlich ist das mit den Enumerationen aber adaptierbar.
 

zlFavourite

Aktives Mitglied
Also jede Waffe braucht diese Attribute und Du hast ja unterschiedliche Schwerter. Ein gutes Schwert mit besseren Werten und ein einfaches Schwert mit weniger guten Werten z.B.

Daher musst Du bei der Erstellung Attribute angeben.

Rein technisch ist es schlicht so, dass Du das angeben musst, was Du im Konstruktor vorgegeben hast. Du hast jetzt nur einen Konstruktor, bei dem Du Werte angeben musst. Aber du kannst natürlich noch weitere Konstruktoren anlegen. Wenn Du noch einen Konstruktor schreibst, der keine Parameter nimmt, dann kannst Du ein Schwert auch entsprechend anlegen:
C#:
Schwert schwert = new Schwert();

Aber die Frage, ob dies so Sinn macht, kannst nur Du entscheiden, denn Du weisst, was Du wie machen willst in Deiner Applikation.

Und bezüglich C# ggf. noch der Hinweis auf die MSDN Foren - da ist man in der Regel besser aufgehoben mit c# Fragen als in einem Java Forum.
(Ich nehme mal an, dass es C# ist - der Code sieht zumindest danach aus bezüglich Properties und so :) )
Danke für die Antwort. Also dann kann ich die Werte in der Klasse Waffe weglassen und einfach beim erstellen einer neuen Waffe (Objekt) die Werte angeben?

Ich habe die Frage schon in dem MSDN Forum gestellt :)
 

zlFavourite

Aktives Mitglied
Wie stark ausgefeilt willst du das Ganze denn haben?

Klar...du könntest jedes Mal alle beliebigen Werte im Konstruktor übergeben. Dann kannst du an jeder Stelle deines Programms laufend beliebig verschiedene Schwerter erzeugen, ich persönlich fände das aber nicht gerade gut.
Eigentlich will man da doch ein paar wohldefinierte und in ihren Werten ausbalancierte Schwerter unterschiedlicher Klassen (ich meine sowas wie "Einfaches Bauernschwert", "Rostiges und stumpfes Ritterschwert", "Goldenes Ritterschwert", aber nicht daß was man in Java unter einer Klasse versteht) haben.

Auch auf die Gefahr hin daß ich hier wieder Haue wegen übertriebener OOP bekomme:
Ich würde die verschiedenen gewünschten Schwertklassen in einer Enumeration abbilden. Du kannst da Einträge für einfache Bauernschwerter oder König Arthurs Drachenbändiger erstellen. Und: du kannst einer Enumeration weitere Eigenschaften hinzufügen, so daß jeder Enumerationseintrag andere Werte für Schaden, Geschwindigkeit (oder was du sonst für Schwertcharakteristika hast).
Und im Konstruktor übergibst du einfach einen Enumerationswert, und der Schwertkonstruktor zieht sich die Werte aus dem Enumerationswert.
Und brauchst dann keine verschiedenen Code-Klassen, sondern einfach nur eine einzige public class Sword.

Warum ich das so lösen würde: Es entsteht meiner Meinung nach sehr angenehm zu lesender und sich selbstdokumentierender Quellcode. Neue Schwertklassen (also die Schwerter an sich, keine Codeklassen) kannst du zentral an einer Stelle (nämlich in der Enumerationsklasse) erstellen, und bestehende Schwertklassen auch leicht ändern, und hast dazu eine gute Übersicht weil du alles zusammen in einer Datei hast.
Und du kannst auch sehr leicht zufällig eine Schwertklasse erzeugen: Enumerationen können als Array geliefert werden, und da mußt du dir einfach nur noch zufällig eine Enumeration geben lassen.

PS: Ich sehe jetzt erst daß es nicht um Java geht, von C# habe ich aber keine Ahnung. Wahrscheinlich ist das mit den Enumerationen aber adaptierbar.
Ich habe bis jetzt noch nie mit Enumerationen gearbeitet, aber ich kann mir das mal anschauen. So kann ich mit meinem Wissen nur oberflächlich etwas damit anfangen. Aber ich verstehe den Gedanke :)
 

White_Fox

Top Contributor
Ich habe gerade überlegt, noch ein Beispiel zu stricken, aber hier gibt es auch eine Erklärung dazu.
So wie der das da in 3. mit den Elementbezeichnungen macht, meinte ich das. Da können nicht nur Strings rein, und man ist mit solchen Eigenschaften auch nicht auf eine beschränkt.
Wie gesagt - alles in Java, aber ich wäre schon etwas sehr enttäuscht von C#, wenn es das da nicht gibt.

Ich habe bis jetzt noch nie mit Enumerationen gearbeitet
Das solltest du unbedingt mal tun, Enumerationen können echt Spaß machen und vieles vereinfachen, ich setze sie jedenfalls gerne ein.
 

Ähnliche Java Themen

Neue Themen


Oben