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":
"FeatureVector" sei eine abstrakte Klasse, welche erst implementiert werden muss:
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
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