Problem mit austauschbaren Klassen

Status
Nicht offen für weitere Antworten.

RTC

Mitglied
Hallo Leute.

Eigentlich kenne ich mich in Java schon ganz gut aus, aber das folgende Problem bringt mich zur Verzweiflung.
Also: ich habe eine Klasse "Tree", die einen Baum darstellt, an dessen Wurzel ein Bild angehängt wird. Die Söhne entstehen nun dadurch, dass einzelne Segmente dieses Bildes extrahiert und wiederum als Bilder gespeichert werden. Soweit so gut. Nun möchte ich an jedem Knoten einen Merkmalsvektor "FeatureVector" anbringen, der das jeweilige Segment beschreibt und genau dieser FeatureVector sol austauschbar sein.

Ich habe also zunächst einen Knoten "TreeNode":
Code:
class TreeNode{
  ImagePlus img;
  FeatureVector features;
  ArrayList<TreeNode> children;
  
  public TreeNode(ImagePlus img){
    this.img = img;
    // Erstellung des FeatureVectors
  }
}

"FeatureVector" sei eine abstrakte Klasse, welche erst implementiert werden muss:
Code:
abstract class FeatureVector{
  public abstract FeatureVector();
  public abstract void calculateFeatures();
}

Das Problem ist jetzt: die Erstellung des FeatureVectors soll im Konstruktor von TreeNode erfolgen, doch dazu muss dort ja bekannt sein, welche konkrete Implementierung benutzt werden soll. Und genau das kriege ich nicht hin. Auch mit Typschablonen geht es nicht, da ich von diesen ja keine Instanzen erzeugen kann.

Den FeatureVector außerhalb zu erstellen und dann per Konstruktor zu übergeben widerstrebt mir, aber mal angenommen ich würde dies tun: in der Klasse Tree habe ich eine Funktion, welche den Baum automatisch aufbaut. Mindestens dort muss also bekannt sein, welche konkrete Implementierung von FeatureVector verwendet werden soll, ansonsten tritt genau dasselbe Problem auf. Die Klasse Tree soll aber auch unabhängig von konkreten Implementationen sein, es ist auch gar nicht nötig dass dort eine konkrete Implementierung bekannt ist - der FeatureVector soll nur von außen abgerufen und dann verarbeitet werden können, Tree macht nichts damit, er soll dort nur über die Methode FeatureVector.calculateFeatures() erstellt werden.

Die einzige unschöne Lösung von mir bisher ist die Übergabe von "Protoyp-Objekten" von FeatureVectors an den Tree-Konstruktor, die dann für jeden TreeNode geklont werden. Aber das halte ich nicht wirklich für guten Stil, zumal es vom Anwender scheinbar unnötige Übergaben von Objekten der konkreten Implementierung erfordert. Typschablonen finde ich da schon besser, nur wie gesagt: davon lassen sich ja keine Objekte instanziieren.

Habt ihr einen Lösungsvorschlag wie ich das möglichst elegant und unter Einhaltung der Austauschbarkeit von FeatureVector hinbekomme?

Vielen Dank für eure Hilfe,
Matthias
 
S

SlaterB

Gast
soviel Text aber wenig zum eigentlichen Problem,

was soll denn nun passieren?
der TreeNode soll ein Feature erstellen, warum macht er es nicht?
er kann sich die Klasse selber aussuchen, er kann von außen einen Hinweis bekommen welche Klasse zu wählen,
ALLES ist denkbar, nichts geht nicht,
was ist die Frage??

> Aber das halte ich nicht wirklich für guten Stil

es gibt nur schlechte Stile, wenn man bessere zum Vergleich kennt,
warum dann nicht die besseren einsetzen, was immer du da auch vorhast?

-----

und was hat die Entscheidung bei der einmaligen Erstellung mit 'Austauschbarkeit' zu tun, die du so betonst?
oder meinst du damit nur 'verschiedene Subklassen'?
wenn du das Objekt in einer Variablen der abstrakten Oberklasse speicherst, dann spricht doch von Natur aus nix dagegen?
 

RTC

Mitglied
Hallo.

Ich dachte eigentlich, ich hätte das Problem beschrieben, aber egal.

SlaterB hat gesagt.:
er kann sich die Klasse selber aussuchen, er kann von außen einen Hinweis bekommen welche Klasse zu wählen
Aha, wie das?


SlaterB hat gesagt.:
und was hat die Entscheidung bei der einmaligen Erstellung mit 'Austauschbarkeit' zu tun, die du so betonst?
FeatureVector soll gegen eine beliebige Subklasse ausgetauscht werden können.
 
S

SlaterB

Gast
int-Variable, Klassenname, boolean, gar dynamischer Code,
alles was es in Java gibt,

> Aha, wie das?

wie nicht?
 

RTC

Mitglied
Ich glaube du verstehst das Problem noch nicht ganz: die konkreten Subklassen, die verwendet werden können sind nur einem Benutzer außerhalb von Tree bekannt, nicht aber in den Klassen Tree, TreeNode etc. - demzufolge fällt sowas wie mit enum, int, boolean oder was weiß ich zur Aufzählung weg.

Edit: noch was überlesen - wie übergibst du den Namen einer zu verwendenden Klasse? Ich dachte halt, dass ich das nur über Typschablonen mache, aber wie oben schon geschrieben: geht nunmal nicht.
 
M

maki

Gast
Hallo RTC,

du könntest ein konkretes FeatureVektor Objekt im Konstruktor übergeben, damit muss dann nur die Aufrufende Klasse die konkrete implmentierung wissen.

Ansonsten solltest du dir vielleciht das "Dependency Injection Pattern" ansehen, könnte passen.
 
S

SlaterB

Gast
Schritt für Schritt kommt man kaum voran, die nächste Frage hättest du dir denken können:
wie soll dann
> die Erstellung des FeatureVectors soll im Konstruktor von TreeNode erfolgen
funktioniern, was passiert da, welche Informationen werden übergeben,
wieso wird nicht der FeatureVector von außen übergeben usw.

eine Möglichkeit wäre, von außen ein Objekt der Klasse FeatureVectorFactory zu übergeben,

mit einer Operation
FeatureVector createVector(Parameter);

die der Ersteller des Baums passend implementiert:

FeatureVector createVector(Parameter) {
return new SpezialVector(Parameter);
}

das zählt zum Punkt 'von außen einen Hinweis durch dynamischen Code' ;)
 

RTC

Mitglied
Hallo maki.

Das mit dem konkreten FeatureVector-Objekt hatte ich oben schon beschrieben. Tree müsste dieses Objekt dann für jeden Knoten klonen und der Anwender sollte imho nicht auf diese Weise dem Tree mitteilen welche Klasse er intern zu benutzen hat. Danke für den Hinweis mit dem Pattern, ich guck mal nach...

Gruß, Matthias
 

RTC

Mitglied
SlaterB hat gesagt.:
wie soll dann
> die Erstellung des FeatureVectors soll im Konstruktor von TreeNode erfolgen
funktioniern, was passiert da, welche Informationen werden übergeben,
wieso wird nicht der FeatureVector von außen übergeben usw.
Hatte ich oben beschrieben, aber egal. Hm, ich glaub das nächste mal schreibe ich einen kurzen ungenauen Text und beantworte Fragen dann inkrementell :D Ich weiß, längere Texte können anstrengen - zudem noch an Montagen ^^

SlaterB hat gesagt.:
eine Möglichkeit wäre, von außen ein Objekt der Klasse FeatureVectorFactory zu übergeben,

mit einer Operation
FeatureVector createVector(Parameter);

die der Ersteller des Baums passend implementiert:

FeatureVector createVector(Parameter) {
return new SpezialVector(Parameter);
}

das zählt zum Punkt 'von außen einen Hinweis durch dynamischen Code' ;)
Ok, hört sich zumindest mal nach einer Möglichkeit an die besser ist als ein zu klonendes Objekt zu übergeben. Danke schonmal.

Mal zwischendurch: mit Typschablonen lässt sich hier wirklich nichts anfangen? Weil das ansonsten ja sehr elegant ist und auch für Typsicherheit sorgt, darum war ich längere Zeit ziemlich darauf fixiert.

Gruß, Matze
 
S

SlaterB

Gast
du meinst Generics? damit ist natürlich auch vieles möglich, Objekte erstellen aber ziemlich schlecht,
da du dann eh Subklassen brauchst kannst du aber auch ganz einfach die Operation createVector();
in SpecialNode, der Unterklasse von TreeNode für SpecialVectors, einfügen

Generics wäre dann höchstens interessant, falls allgemein definierte get- und set-Operationen den Typ SpecialVector statt FeatureVector aufweisen sollen
 

RTC

Mitglied
Danke @maki für den Link, ich werd ihn mir mal anschauen.
Danke @Slater für den Hint mit der Factory, ich glaube das ist soweit die beste Möglichkeit. Generics werde ich wegen der Typsicherheit doch noch verwenden, hab mein Programm erstmal soweit umgestellt und es geht gut. Typschablonen, Templates, Generics, ... argl, das ständige Switchen zwischen Java, C++ und C# macht mich ganz kirre.

Thema ist erstmal erledigt, vielen Dank für eure schnelle Hilfe.


Gruß, Matthias
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Problem mit dem Lesen einer projektinternen .csv aus der runnable JAR Allgemeine Java-Themen 3
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
Splayfer JDA Problem mit MessageCounter Allgemeine Java-Themen 0
Splayfer Problem mit BufferedWriter Allgemeine Java-Themen 3
F Streams als Alternative für dieses Problem ? Allgemeine Java-Themen 15
N Maven Problem mit Datenbanktreiber (H2 Embedded) Allgemeine Java-Themen 12
T Problem beim Umwandeln in eine Jar-Datei Allgemeine Java-Themen 3
B Einfach Elemente zweier Arraylisten kreuz und quer vergleichen, min und max Problem? Allgemeine Java-Themen 16
C ArrayList Problem Allgemeine Java-Themen 3
kev34 nim-Spiel problem Allgemeine Java-Themen 1
D Firebase retrieve data Problem, Child Element wird nicht angesprochen Allgemeine Java-Themen 0
G Welches Problem besteht bei den Typparametern? Allgemeine Java-Themen 5
temi Problem mit Aufrufreihenfolge bei Vererbung Allgemeine Java-Themen 3
Sumo_ow "ArrayIndexOutofBoundsException: 2" Array Problem Allgemeine Java-Themen 6
T PIM basierend auf netbeans via AnyDesk Problem Allgemeine Java-Themen 3
xGh0st2014 Problem mit Java Array Allgemeine Java-Themen 1
Kirby.exe Verständnis Problem bei Rucksack Problem Allgemeine Java-Themen 6
B Eclipse-Lombok-Problem Allgemeine Java-Themen 19
I Input/Output ObjectOutputStream - Problem Allgemeine Java-Themen 7
1 Multiple Choice Knapsack- Problem Allgemeine Java-Themen 2
kodela Problem mit strukturiertem Array Allgemeine Java-Themen 18
E Problem mit Gridlayout und Button Allgemeine Java-Themen 2
A Array Problem Allgemeine Java-Themen 8
bueseb84 Problem Allgemeine Java-Themen 0
S Problem mit Arrays Allgemeine Java-Themen 1
D Nullpointer Exception Problem Allgemeine Java-Themen 5
B Problem mit meinen Klassen Allgemeine Java-Themen 6
A HashMap Methode "get()"-Problem Allgemeine Java-Themen 28
J Problem beim Umstellen auf Java jdk 13 Allgemeine Java-Themen 3
J Problem bei Install java 13 Allgemeine Java-Themen 3
X Profitable Reise Problem Allgemeine Java-Themen 32
A Problem beim öffnen von Java-Installern Allgemeine Java-Themen 1
Dann07 Problem mit JavaMail API Allgemeine Java-Themen 26
J Problem beim Generischen Klassen und Interfaces Allgemeine Java-Themen 2
L Klassen Algorithmus für das folgende Problem entwickeln? Allgemeine Java-Themen 30
J Clear-Problem Allgemeine Java-Themen 10
B Problem zu einem Java Projekt Allgemeine Java-Themen 6
S JFileChooser Problem Allgemeine Java-Themen 4
M Traveling Salesman - MST Heuristik Problem Allgemeine Java-Themen 4
J Traveling Salesman Problem Allgemeine Java-Themen 14
E Java Editor Problem mit 2er Exceptions Allgemeine Java-Themen 12
C code oder Bibliotheken für 2-Center Problem Allgemeine Java-Themen 4
M Salesman Problem - Bruteforce Algorithmus Allgemeine Java-Themen 23
S Methoden Problem mit NullPointerException Allgemeine Java-Themen 9
Javafan02 Problem mit if-clause Allgemeine Java-Themen 17
J Lombok Problem mit Konstruktoren bei Verberbung Allgemeine Java-Themen 1
kodela Event Handling Problem mit der Alt-Taste Allgemeine Java-Themen 16
W Threads Problem Allgemeine Java-Themen 15
D (Verständnis-)Problem mit Unterklasse Allgemeine Java-Themen 4
S Problem mit Generic bei unmodifiableCollection Allgemeine Java-Themen 4
S jserialcomm Problem Allgemeine Java-Themen 1
Flynn Thread-Problem... Allgemeine Java-Themen 2
J Generische Interface - Problem Allgemeine Java-Themen 3
G Problem beim GUI Allgemeine Java-Themen 9
L Applet Problem "security: Trusted libraries list file not found" ? Allgemeine Java-Themen 7
A OOP Problem beim Berechnen der größten Fläche eines Ringes Allgemeine Java-Themen 19
T Problem mit externen Datenbankzugriff über SSH Tunnel Allgemeine Java-Themen 4
F Problem beim Einlesen einer Textdatei Allgemeine Java-Themen 12
S Java OpenOffice Problem mit Windows-Benutzerwechsel Allgemeine Java-Themen 19
K Threads RAM Problem Allgemeine Java-Themen 20
P Operatoren Problem mit Zähler in recursiver Schleife Allgemeine Java-Themen 2
C Int Problem Allgemeine Java-Themen 8
C J2V8 NodeJs Java Bride Problem und Frage!?!? Allgemeine Java-Themen 1
J Problem bei Hashmap Key-Abfrage Allgemeine Java-Themen 4
C Webseiten Programm problem Allgemeine Java-Themen 5
M LocalDate Problem Allgemeine Java-Themen 4
J "Problem Objektorientierung" Allgemeine Java-Themen 20
geekex Problem Meldung! Was tun?! Allgemeine Java-Themen 19
T Klassen Override Problem Allgemeine Java-Themen 7
L Unbekanntes Problem Allgemeine Java-Themen 1
FrittenFritze Problem mit einer JComboBox, Event temporär deaktivieren Allgemeine Java-Themen 11
Blender3D Java Swing Programm Windows 10 Autostart Problem Allgemeine Java-Themen 2
F HTTPS Zertifikat Problem Allgemeine Java-Themen 3
M OpenCV KNearest Problem Allgemeine Java-Themen 0
Tommy Nightmare Project Euler: Problem 22 Allgemeine Java-Themen 2
C Abstrakte Klasse, lokale Variable-Problem Allgemeine Java-Themen 1
N Vererbung Design-Problem mit vorhandenen, von der Klasse unabhängigen Methoden Allgemeine Java-Themen 12
P Eclipse Projekt anlegen macht Problem Allgemeine Java-Themen 1
RalleYTN META-INF/services Problem Allgemeine Java-Themen 3
F Java Mail Problem: Authentifizierung wird nicht immer mitgeschickt Allgemeine Java-Themen 1

Ähnliche Java Themen

Neue Themen


Oben