Vererbung Design-Problem mit vorhandenen, von der Klasse unabhängigen Methoden

Naryxus

Aktives Mitglied
Hey,

ich habe ein recht interessantes und schwer zu fassendes Problem mit meinem Klassen-Design (deshalb auch der etwas nichts-aussagende Titel).

Ich versuche das Problem im folgenden gleich mit dem Anwendungsbeispiel zu verdeutlichen.
Es geht im Allgemeinen um das Sortieren von Helden mit verschiedenen Eigenschaften bei gegebenem Gegner. Ein Held ist dabei charakterisiert durch eine Menge von Eigenschaften. Eine Eigenschaft bekommt letztendlich den Gegner übergeben und entscheidet auf Grundlage dessen, ob die Eigenschaft förderlich, neutral oder nicht förderlich ist.
So berechnet sich dann schließlich der Wert des Helden aus allen seinen Eigenschaften.

Eine Eigenschaft oder auch Fähigkeit besitzt also eine Methode, die (momentan noch) eine 1 für förderlich, eine 0 für neutral oder eine -1 für nicht förderlich zurückgibt. In meinem aktuellen Design habe ich dies als Interface designed:

Java:
public interface Ability {

   int evaluate(Enemy enemy);

}

Nun ist mir aber aufgefallen, dass keine Eigenschaft in irgendeiner Weise von den Attributen des Helden abhängig ist. Sie könnte also statisch definiert sein, weil sie lediglich von dem Gegner abhängt. Die Auswertung jedoch wird für jede Eigenschaft anders geprüft.
Bekanntlich kann man ja aber keine statischen Methoden abstrakt vererben. Somit stehe ich vor dem Dilemma, dass ich entweder meine evaluate-Methode nicht statisch deklarieren kann oder einen Helden nicht wie folgt implementieren kann:
Java:
public class Hero {

   Set<Ability> abilities;

}

Ich bin bei meiner Recherche nach ähnlichen Problemen auf das AbstractFactory-Pattern gestoßen. Entweder habe ich das nicht richtig verstanden oder es passt nicht richtig zu meinem Problem.

Stehe ich vielleicht gerade auf dem Schlauch und gibt es ein gutes Design für meine Zwecke?
Oder würdet ihr sagen, ihr verzichtet auf die statische Deklarierung und würdet jedes Mal ein Objekt von der entsprechenden Ability erzeugen?

Grüße,
Naryxus
 

mrBrown

Super-Moderator
Mitarbeiter
Welches ist denn dein Problem?

Hero hat eine Menge von Abilitys, und für jede dieser kann geprüft werden (evaluate ist da ein schlechter Name für ;) ), wie gut sie zu einem Gegner passt.

Ich seh da nichts, was man statisch bräuchte (gib generell nicht viel davon^^) und was da durch eine Factory besser gelöst werden kann seh ich auch nicht (die finde ich generell aber gut, und kann zB genutzt werden, um die Abilitys zu erstellen, hat aber nichts mit deren Nutzung zu tun).
 

Naryxus

Aktives Mitglied
Danke für deine Antwort.

Ich mache mal vielleicht ein Beispiel: Es gibt eine Fähigkeit, die nennt sich "FemmeFatale" und der Held (bzw. meistens Heldin :D) ist stärker gegenüber männlichen Gegnern.

Und somit würde ich gerne eigentlich nur die Zeile sparen, in der ich ein Objekt der Klasse FemmeFatale erstellen muss, um die "evaluate"-Methode aufrufen zu können. Denn bei zwei Helden müsste ich dann die Klasse doppelt erstellen.

Ich hoffe, du verstehst in etwa, was ich meine?
 

mrBrown

Super-Moderator
Mitarbeiter
Und somit würde ich gerne eigentlich nur die Zeile sparen, in der ich ein Objekt der Klasse FemmeFatale erstellen muss, um die "evaluate"-Methode aufrufen zu können. Denn bei zwei Helden müsste ich dann die Klasse doppelt erstellen.
Irgendwo brauchst du die Zuordnung Held->Ability aber auf jeden Fall.
Kannst auch den Weg über String/Int gehen und dann erst wenn nötiz jeweils auswerten, was das ist, aber was gewinnst du damit?
Ob du jetzt ein Objekt oder mehrere erstellst macht keinen wirklichen Umterschied. Wenn du unbedingt mehrere vermeiden willst, nutz ne Factory (sowieso sinnvoll) und cache darin die bereits erstellten
 

Naryxus

Aktives Mitglied
Wenn du unbedingt mehrere vermeiden willst, nutz ne Factory (sowieso sinnvoll) und cache darin die bereits erstellten

Meinst du in etwa folgendes?
Java:
public class AbilityFactory {

   private static FemmeFatale ff;

   public static FemmeFatale getFF() {
      return AbilityFactory.ff;
   }
}

Macht es dann Sinn das Ganze in einem static-Block zu initialisieren?
Java:
public class AbilityFactory {

   private static FemmeFatale ff;

   static {
      AbilityFactory.ff = new FemmeFatale();
   }
}

Oder das in die jeweiligen Methoden zu packen?

Java:
public class AbilityFactory {

   private static FemmeFatale ff;

   public static FemmeFatale getFF() {
      if(AbilityFactory.ff != null)
         AbilityFactory.ff = new FemmeFatale();
      return AbilityFactory.ff;
   }
}
 

mrBrown

Super-Moderator
Mitarbeiter
Beides Möglich, gibt aber auch nich andere Varianten.

Ich würd das nur in der Factory-Instanz halten, uU mit einfacher Map von String auf Ability.
Die Factory dann selbst als Singleton auslegen, im Idealfall über DI-Framework
 

AndyJ

Bekanntes Mitglied
Ich wuerde einen Comparator implementieren (siehe java.util.Comparator), der die Helden in Bezug auf den aktuellen Feind nach Staerke sortiert:

Code:
import java.util.*;

public class HeroRating implements Comparator<Hero> {
   
  private final Enemy enemy;

  public HeroRating(Enemy enemy) {
  super();
  this.enemy = enemy;
  }

  @Override
  public int compare(Hero hero1, Hero hero2) {
  // implementiere hier, was immer noetig ist, um die Helden nach Staerke zu sortieren

  // gib -1 zurueck, wenn hero1 schwaecher ist
  // gib 0 zurueck, wenn die gleich stark sind
  // und gib 1 zurueck, wenn hero1 staerker ist
   
  return 0;
  }

}

Dann kannst du deine Helden easy nach Staerke sortieren:

Code:
import java.util.*;

public class SortHeros {

  public static void main(String[] args) {
  List<Hero> myHeros = new ArrayList<>(); // pack da alle Helden rein, unsortiert
  Enemy enemy = null; // erzeuge einen fiesen Feind
  Comparator<Hero> heroComparator = new HeroRating(enemy); // baue einen Comparator dafuer
   
  Collections.sort(myHeros, heroComparator); // sortiere nach Staerke
  // myHeros sollte hier sortiert sein
  }

}
 

Naryxus

Aktives Mitglied
Danke AndyJ, darüber habe ich auch schon nachgedacht. Das wäre allerdings trotzdem nur eine Problemverschiebung, weil ich dann trotzdem noch die Abilities überprüfen und dann auf die Enemies testen müsste. Halt dann stattdessen in der compare-Methode.
 

mrBrown

Super-Moderator
Mitarbeiter
Die Factory ist der erste Schritt dahin, die kann man erstmal auch als ganz normale Klasse lassen, man hat dann halt uU "doppelte" Objekte, die stören ja aber nicht (außer du möchtest mit == arbeiten). Aufräumen kann man das später immer noch.
 

Naryxus

Aktives Mitglied
Die Factory dann selbst als Singleton auslegen, [...]

Hey, ich habe nochmal eine Frage zu der Factory. Ich habe die Fähigkeiten jetzt in einer Map von String auf Ability gespeichert. Diese Map ist statisch. Dementsprechend wäre auch die Factory-Methode statisch, um auf die Fähigkeiten zuzugreifen.
Du sagtest, dass du die Factory als Singleton auslegen würdest. Aber prinzipiell brauche ich ja gar kein Objekt von der Factory, da ich statisch drauf zugreife.
Ich hätte jetzt lediglich den Konstruktor der Factory privat deklariert, damit kein Objekt erzeugt werden kann. Wie ist denn deine Meinung dazu?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Landei Design-Problem Formel-Parser Allgemeine Java-Themen 10
B Design Problem Allgemeine Java-Themen 8
Torres Design-Problem mit Jakarta Struts Allgemeine Java-Themen 2
J Meinung zum verwendeten Design Pattern Allgemeine Java-Themen 4
S Noch eine Design-Frage zu Setter Allgemeine Java-Themen 6
S ArrayList Design Allgemeine Java-Themen 4
S Interface Design von HookUp oder Callback Methoden für eigenes Framework Allgemeine Java-Themen 9
Kirby.exe Framework für Game Design Allgemeine Java-Themen 8
C WindowBuilder Design funktioniert nicht Allgemeine Java-Themen 0
M Diverse Design-Fragen Allgemeine Java-Themen 6
rentasad Design-Frage - Interfaces, Klassen, statische Methoden Allgemeine Java-Themen 3
M OOP Design Pattern - "extends Observable implements Observer" Allgemeine Java-Themen 0
T OOP Fehler im Design Allgemeine Java-Themen 9
perlenfischer1984 Welches Design Pattern ist geegneit. Allgemeine Java-Themen 7
perlenfischer1984 Hilfe bei Design (Pattern) Allgemeine Java-Themen 5
R Parameter Adapter - Design Allgemeine Java-Themen 1
D Bezüglich Design meines Codes Allgemeine Java-Themen 1
D OOP Design Pattern für GUI - Datenbank Anwendung Allgemeine Java-Themen 1
S Java Design Frage Allgemeine Java-Themen 10
L OOP Klassen-Design (static oder nicht?) Allgemeine Java-Themen 3
P Auf die Anzahl der Joins achten beim WS design Allgemeine Java-Themen 1
M OOP Design Frage Allgemeine Java-Themen 2
J Domain Driven Design - Modellierungsfrage Allgemeine Java-Themen 3
F Welches Design Pattern? Allgemeine Java-Themen 3
H MVC Design Allgemeine Java-Themen 9
J Swing Eigenes Button-design Allgemeine Java-Themen 2
Q Kapselung Allgemeine Design- Frage Allgemeine Java-Themen 8
Z Design um boolsche ausdrücke zu speichern & auszuwerten Allgemeine Java-Themen 3
A Sinnvolles Software Design bei Eigenschaftsänderungen von Objekten Allgemeine Java-Themen 7
C Gutes Code Design (3 Schichten Modell) Allgemeine Java-Themen 19
D Design Stations-Gitter Allgemeine Java-Themen 4
M Public Static importRunning -> Bad Design oder ok ? Allgemeine Java-Themen 5
L Software-Design: Kommunikation mit SerialPort (RXTX) Allgemeine Java-Themen 2
D [Drag&Drop] Design-Pattern-Frage Allgemeine Java-Themen 4
G Design Patterns für Programm Allgemeine Java-Themen 3
I Wie populär ist Design by Contract in Java und was haltet ihr davon? Allgemeine Java-Themen 5
J Aktionen im State-Design-Modell Allgemeine Java-Themen 3
S Design Oberfläche Allgemeine Java-Themen 2
L Design-Frage: Platzierung der Save-Methode Allgemeine Java-Themen 3
G Domain Driven Design Model Allgemeine Java-Themen 14
G konkretes Domain Driven Design Aggregate Allgemeine Java-Themen 2
ruutaiokwu welches design pattern? frage an die oo-experten unter euch... Allgemeine Java-Themen 3
G Accordion Design Pattern Frage Allgemeine Java-Themen 2
hdi Hilfe beim Design (Stichwort OO, Pattern, ...) Allgemeine Java-Themen 11
faulelotte Verständnisproblem Domain Driven Design Allgemeine Java-Themen 3
S Frage zum Design der Datenstruktur Allgemeine Java-Themen 10
D design gesucht - Angabe von zu ersetzenden substrings Allgemeine Java-Themen 2
D Design ohne Getter und Setter Allgemeine Java-Themen 8
D Design: on-the-fly-Parsing + Datenstrukturen Allgemeine Java-Themen 5
N Welches design pattern? Allgemeine Java-Themen 8
D design client server Allgemeine Java-Themen 10
T Design-Frage Allgemeine Java-Themen 14
S XML-Parsing / public-Member-Variablen / Design-Frage Allgemeine Java-Themen 8
S JToolBar Design Allgemeine Java-Themen 3
M Bildersyncronisierung - Design Patterns? Allgemeine Java-Themen 2
T Design - Exception in Thread Allgemeine Java-Themen 3
G Composite, Design Pattern, printTree Allgemeine Java-Themen 42
N Design-Frage: persistent machen per Reflection Allgemeine Java-Themen 3
M Frage zum Design :: allgemein Allgemeine Java-Themen 6
M MVC Design Pattern - Verständniss Fragen Allgemeine Java-Themen 3
U Frage zu DB Design Allgemeine Java-Themen 3
K Design / Implementierung Allgemeine Java-Themen 5
N Checkstyle - Design for Extension Allgemeine Java-Themen 4
F Design Pattern zur Realisierung von Mehrfachvererbung? Allgemeine Java-Themen 8
E Was ist ein gutes Design fuer meine Programm? Allgemeine Java-Themen 3
F Paket und Software Design Fragen. Allgemeine Java-Themen 5
P Apple Design Allgemeine Java-Themen 5
S design frage Allgemeine Java-Themen 10
T Design-Tipp gesucht Allgemeine Java-Themen 2
M Design von Java Klassen Allgemeine Java-Themen 2
G java design von klassen und projekten Allgemeine Java-Themen 6
K Design: Klassen in Pakete aufteilen - Eure Meinung Allgemeine Java-Themen 8
S Programmierstil / design Allgemeine Java-Themen 9
S Exception design Allgemeine Java-Themen 2
m@nu Exception-Design Allgemeine Java-Themen 4
R Design-Frage Allgemeine Java-Themen 9
N Hilfe beim Design Allgemeine Java-Themen 13
D Design Pattern: Singleton Allgemeine Java-Themen 4
A Anwendungs-Design (Plugin-Architektur) Allgemeine Java-Themen 4
krgewb Problem mit Umlauten und Eszett bei InputStream Allgemeine Java-Themen 3
Max246Sch Backtracking Problem Box Filler Allgemeine Java-Themen 6
NightVision402 VisualVM Startskript Problem Allgemeine Java-Themen 3
javaBoon86 Email Server Connection Problem Allgemeine Java-Themen 1
F Problem mit PDFBOX Library Allgemeine Java-Themen 1
A Java modul Problem Allgemeine Java-Themen 4
D Read JSON File Problem Allgemeine Java-Themen 9
urmelausdemeis Exception in thread "main" java.lang.Error: Unresolved compilation problem: Allgemeine Java-Themen 7
J Problem mit JasperReports Allgemeine Java-Themen 8
M log4j Problem mit jlink Allgemeine Java-Themen 19
8u3631984 Problem beim Mocken von Record Klassen Allgemeine Java-Themen 4
torresbig Website login Problem - Jsoup, wie bisher, klappt nicht! Allgemeine Java-Themen 31
P Selenium . getText Problem Allgemeine Java-Themen 9
A Jar zu Exe Problem Allgemeine Java-Themen 13
sserio Variablen Liste erstellt und ein Problem mit dem Index Allgemeine Java-Themen 6
S Folgendes Problem bei einem Programm Allgemeine Java-Themen 1
stormyark Problem beim Klassen erstellen Allgemeine Java-Themen 1
A Thread.sleep Problem Allgemeine Java-Themen 2
A Problem bei der Nachbarschafttest Allgemeine Java-Themen 11
Splayfer Problem: no main manifest attribute Allgemeine Java-Themen 3
G javamail Problem beim Empfangen von Nachrichten Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben