Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Themengebiete » Praktische Informatik » Listen mit mehreren Listen » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen Listen mit mehreren Listen
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Tommy1234
Foren As


Dabei seit: 12.07.2015
Beiträge: 93

Listen mit mehreren Listen Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Hallo,

muss kurz ausholen.

Ich arbeite an einem Warcraft Klon und bin gerade dabei meine einzelnen Sprites zu verwalten. Bisher halte ich Einheiten gleichen Typs jeweils in einer Liste.

Es wäre aber denke ich besser alle Sprites(Einheiten) in einer "großen" Liste zu verwalten, das Problem das ich aber dabei habe ist, dass meine Einheiten von der Oberklasse Sprite erben und ich dann beim erzeugen der "großen" Liste nicht auf die Methoden der Unterklassen zugreifen kann.

Ich habe bereits versucht, Für jede Einheit eine Liste in Sprite zu erzeugen und von jeder Einheit die relevanten Methoden aufzurufen, allerdings wird erstens nichts angezeigt und außerdem auch kein Fehler (NullPointerException) geworfen.

Ich habe keine Ahnung wie man sowas realisiert und bitte um Hilfe.

Gruß Tommy
11.04.2018 17:08 Tommy1234 ist offline Beiträge von Tommy1234 suchen Nehmen Sie Tommy1234 in Ihre Freundesliste auf
as_string as_string ist männlich
Haudegen


Dabei seit: 06.11.2013
Beiträge: 639
Herkunft: Heidelberg

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Arrays von Arrays?
Welche Programmiersprache eigentlich? Hast Du ein knappes Beispiel für Deine Liste von gleichartigen Sprites?

Doch, Du kannst auf die Methoden zugreifen, Du musst nur im Zweifelsfall einen Downcast machen. Aber die Frage ist: Musst Du nicht für viele Zwecke, bei denen Du so wie so die ganze Liste abarbeiten musst, i. A. auf Methoden zugreifen, die in der Basisklasse deklariert sind, wenigstens als abstrakte Methode? Normalerweise macht man es ja gerade so, dass man eine gemeinsame Schnittstelle hat, wie für alle Sprites da ist, aber je nach Typ etwas unterschiedliches (für den Untertyp passendes) macht.
Wenn Du mit einem Typ häufig etwas tun musst, während Du mit allen anderen nichts machen musst, stellt sich eher die Frage, wie findest Du alle Objekte genau diesen einen Typs. Wenn Du dann durch die große Liste musst und die nur ausfilterst, wäre das ineffizient.

Bring mal ein konkretes Beispiel, dann kann man Dir eventuell eher helfen.

Gruß
Marco
11.04.2018 17:55 as_string ist offline E-Mail an as_string senden Beiträge von as_string suchen Nehmen Sie as_string in Ihre Freundesliste auf
Tommy1234
Foren As


Dabei seit: 12.07.2015
Beiträge: 93

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Ich programmiere in Java .

Zur Sache:

sagen wir ich habe fünf Arbeiter , drei Nahkampfeinheiten sowie 4 Fernkampfeinheiten nacheinander der Liste hinzugefügt, also die sind jetzt in dieser Spriteliste. Das habe ich erreicht, indem ich .add(new Arbeiter()) usw.aufgerufen habe. Jetzt möchte ich, dass der Arbeiter Holz hackt ein weiterer Gold sammelt und ein Soldat einen Gegner angreift. Diese 3 Methoden sind Unterklassenspezifisch und können irgendwie bei mir nicht aufgerufen werden.

Wie Du vielleicht schon bemerkt hast, handelt es sich bei mir um ein Spiel und die beiden Methoden update() sowie render() (Spielschleife) sind als abstrakte Methoden in der Oberklasse (Spriteklasse) deklariert und somit für die Unterklassen verfügbar.

Momentan verwalte ich jeden Spritetyp wieder in einer eigenen Liste. Ist halt mehr Schreibarbeit, ABER mir wurde erklärt, dass es für mein Spiel besser wäre, die Einheiten nacheinander zu bewegen also prioritär. Und eben dies wäre halt in einer einzigen großen Einheitenliste einfacher umzusetzen denke ich.

Ich hoffe das reicht DIR.
12.04.2018 14:15 Tommy1234 ist offline Beiträge von Tommy1234 suchen Nehmen Sie Tommy1234 in Ihre Freundesliste auf
as_string as_string ist männlich
Haudegen


Dabei seit: 06.11.2013
Beiträge: 639
Herkunft: Heidelberg

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

In Java...
Wenn Du eine Liste von Objekten des Basis-Typs BaseClass hast und dort sind Objekte vom Typ Class A extends BaseClass und vom Typ Class B extends BaseClass, dann bekommst Du nur gemeinsame BaseClass-Methoden aufrufen, das stimmt und sollte auch für alles ausreichen, das Du auf jedes Objekt der Liste anwenden willst.
Wenn Du spezielle Methoden dann doch aufrufen willst, dann musst Du Dir mit deinem Downcast helfen. Also dann
code:
1:
((A) einzelnesObjekt).spezielleAMethode()

Das wiederum funktioniert nur dann, wenn einzelnesObjekt an sich tatsächlich eigentlich vom Typ A ist, obwohl die Referenz "einzelnesObjekt" ja vom Typ BaseClass deklariert ist.
Um das vorab sicher zu stellen, kannst Du so was schreiben:
code:
1:
2:
3:
4:
if(einzelnesObjekt instanceof A) {
  // tue etwas mit einzelnes Objekt, das A spezifisch ist:
  ((A) einzelnesObjekt).spezielleAMethode();
}


Allerdings zeugt es meistens vom schlechtem objektorientiertem Design, wenn Du häufig einen Downcast machen musst. Eventuell sollte man das grundlegender durchdenken. Z. B. musst Du ja konkreten Einheiten die Aufgabe irgendwie nach ihren Fähigkeiten zuweisen, bevor Du über die Liste iterierst. Vielleicht kann sich die Einheit die Aufgabe merken und eine zentrale execute()-Methode führt die dann der Einheit entsprechend aus oder so irgendwas.
Außerdem ist noch die Frage: Musst Du häufig Dinge nur mit Einheiten eines Typs machen, macht es wenig Sinn, alle in einen Topf zu schmeißen und die Einheiten des entsprechenden Typs dann wieder ausfiltern zu müssen.

Sprich: Die Antwort auf Deine konkrete Frage ist letztlich das mit dem Downcast mit vorhergehenden instanceof-Check. Allerdings glaube ich, dass der Grundansatz nicht unbedingt so ideal sein könnte, kann dazu aber nur wenig sagen, weil ich nicht alle Zusammenhänge kenne.

Gruß
Marco
13.04.2018 14:06 as_string ist offline E-Mail an as_string senden Beiträge von as_string suchen Nehmen Sie as_string in Ihre Freundesliste auf
Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
Informatiker Board » Themengebiete » Praktische Informatik » Listen mit mehreren Listen