C# Werte aus vererbten Objekten in ArrayList aufrufen?

2 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

Genauso wie in Java musst du Strings, die du ausgeben lassen möchtest, auch an den Ausgabekanal weiterreichen.

Console.WriteLine(Monster.ToString());

Du würdest an der Stelle aber nur eine Ausgabe wie:

System.Collections.ArrayList

bekommen, da du versuchst, ein ArrayList-Objekt auszugeben. Um die Beschreibungen der einzelnen Elemente bekommen, musst du, wie auch in Java, in irgendeiner Form über die einzelnen Elemente iterieren.

foreach (Attacker monster in Monsters) 
{
  Console.WriteLine(monster.ToString());
}

Da deine abstrakte Klasse die ToString-Methode überdeckt, die üblicherweise von Object geerbt wird, ist es notwendig, die Methode in der Schleife explizit je Element aufzurufen.

Entferne diese Deklaration:

public abstract String ToString();

dann klappt es auch so:

foreach (var monster in Monsters)
{
  Console.WriteLine((monster));
}

Oder:

Console.WriteLine(string.Join(Environment.NewLine, Monsters.ToArray()));

Statt einer ArrayList ist in C# eine List<> meist die bessere Wahl, da sie generisch ist. So könntest dir späteres Casting auch sparen.

var monsters = new List<Attacker>();
// add monsters ...
Console.WriteLine(string.Join(Environment.NewLine, Monsters));

Des Weiteren wäre es gut, wenn du dir die üblichen C#-Konventionen angewöhnen würdest. Klassennamen beginnen genauso wie in Java mit einem Großbuchstaben, in C# gilt das ebenso für Methoden. Felder werden meist mit einem führenden Kleinbuchstaben geschrieben.

Diese vier Felder in der Subklasse

public int hp = 0;
public int def = 0;
public int atk = 0;
public String name = "Guest";

überdecken im Übrigen wohl die Felder der Basisklasse. Es wäre sicherlich passender, sie nur von der Basisklasse zu erben, um doppelten Code einzusparen. Ihre initialen Werte werden zudem eh bei Objekterstellung überschrieben, daher sind die Initialisierungen ohne Nutzen.


crafter32 
Beitragsersteller
 21.10.2021, 19:47

Danke, ich wollte noch fragen, ich habe jetzt noch ein paar getter und setter eingefügt. Wieso werden die mir nicht angezeigt wenn ich versuche aus der ArrayList die Daten auszurufen? Die Getter und Setter sind in der "classes" Klasse.

regex9  21.10.2021, 20:03
@crafter32

Ganz einfach weil deine ArrayList ihre Elemente nur als Object-Instanzen kennt. Du musst jedes Element, welches du aus ihr herausziehst, entweder erst explizit casten oder du verwendest von Anfang an einen generischen Containertyp wie List.

regex9  21.10.2021, 20:09
@crafter32

Vergiss das mit den Getter- und Setter, so wie du es aus Java kennst. In C# gibt es dafür Properties.