In meinem Projekt geht es darum, einen HyperGraph in Java zu implementieren
Mein hyperGraph enthält verschiedene Arten von hyperEdge, abhängig vom Scheiteltyp, den ich habe
Scheitelpunkttyp: Bild, Tags ...
HyperEdge = Homogen (Bezugspunkt gleichen Typs) / Heterogen (Bezugspunkt unterschiedlichen Typs)
Homogene HyperEdge = Bild-Image HyperEdge / Tag-Tag hyperEdge
Dies ist ein schnell zeichnen UML-Diagramm
das ist mein Code
%Vor%
Das Problem ist in der ImageImageHyperEdge-Klasse Ich sollte wissen, welche Art von Feature darauf basiert Ich werde die nächsten Nachbarn von ImageVertex suchen Ich kann es nicht in die abstrakte Methode der Super-Schnittstelle übergeben, da die TagTagHyperEdge-Klasse es nicht benötigt
und wenn ich die ImageImageHyperEdge-Klasse durch die {featureOneHyperEdge-Klasse, ... featureFiveHyperEdge-Klasse} (in der ich den Feature-Typ kenne) ersetze es wird eine Duplizierung von Code sein, da es der Suchalgorithmus für die nächsten Nachbarn ist
feature = Low-Level-Feature eines Bildes (z. B. Farbhistogramm)
Ich habe 5 Arten von Low-Level-Funktion
Ich werde jeden benutzen, um die nächsten Nachbarn meines aktuellen Bildes zu suchen
Alle Funktionen sind in einer einfachen Textdatei gespeichert
derselbe Algorithmus wird verwendet, um die nächsten Nachbarn zu suchen
nur die Datei wird jedes Mal geändert
Ihr UML-Design ist nicht gut genug. Skip the hässliche & amp; schwer zu lesen "Styling", zeigen Sie uns "Vertex" sowie "Edge" und ein Assoziationsdiagramm; nicht Ihre (möglicherweise zu komplizierte) Idee der Vererbung.
Ihre APIs, Design & amp; Grundlegende Frage ist nicht wirklich klar. "Hypergedge" -Klassen könnten eine einzelne Instanz eines Edge darstellen und die beiden Enden davon verbinden; oder sie könnten (wenn besser benannt) einen Kantentyp darstellen und das Diagramm global von einem angegebenen Endpunktparameter aus durchsuchen.
Dies sind völlig verschiedene Designs, Ihre Frage ist bedeutungslos, bis Sie die oben genannten herausfinden.
Wie auch immer, Edge.search () hat nicht die richtige Signatur. Wo VS und VE Anfangs- und Endknoten sind und TE Kantenarten sind, sollte es entweder:
sein %Vor%oder
%Vor%Der Nearest-Neighbor-Algorithmus sollte mit generischen Typen implementiert werden und dann von den konkreten Klassen wie erforderlich (mit genauen Typ-Signaturen) aufgerufen werden.
BTW, wenn Sie "nächster Nachbar" erwähnen; Es ist auch nicht klar, ob "nächster Nachbar" direkt verbundener Scheitelpunkt bedeutet, was trivial ist, oder um den nächsten entfernten Punkt (wie wird Abstand gemessen? Sie geben keinen an) Scheitelpunkt eines angegebenen Typs.
Wie auch immer, das Dienstprogramm & amp; Korrektheit / Notwendigkeit, Subtypen von 'Edge' zu implementieren, scheint unklar. Viele Graphalgorithmen finden Vertices / Nodes interessant und unterteilen diese, aber ich bin mir nicht bewusst, dass die Kanten, die zu diesen führen, untergeordnet werden (oder die Nützlichkeit der Subtypisierung).
Letzter Tipp: Graben Sie die komplexe Namensgebung, KISS. "Vertex" und "Edge" werden Ihnen helfen, eine klare, einfache, verständliche & amp; richtiges Design. Speichere das zusätzliche Wort für nachdem du das hast.
Als Antwort auf weitere Informationen von Nawara:
Dann ist es ein EdgeType, den Sie modelliert haben, und wenn Sie den nächsten Nachbarn fragen, sollten Sie einen Start Vertex & amp; gib entweder Edge (s) zurück - wenn du die Distanzmetriken benötigst - oder Vertices.
Der Verweis auf 'Graph' sollte wahrscheinlich vom Vertex-Parameter impliziert sein.
Soweit Ihre EdgeType-Vererbungshierarchie: subtypes & amp; Vererbung sollte so definiert werden, dass sie Verhaltensmerkmalen folgt, nicht den generischen Typen (Vertex-Typen), auf die sie verweisen. Das Prinzip für das OO-Klassenhierarchie-Design besteht darin, tun zu modellieren, nicht zu sein.
In diesem Zusammenhang könnten Sie einen KnnDistanceEdgeType & amp; FlickrDistanceEdgeType-Klassen entweder als Vorfahren oder, wenn kein anderes Methodenverhalten erforderlich ist, als tatsächliche Implementierungsklassen. Die Feature-Typen / Klassen, nach denen sie suchen, können als Eigenschaften festgelegt werden - mit den Eigenschaften & amp; Generiert anders, um verschiedene Vertex-Typen zu beantworten.
zB
%Vor%Wenn es in EdgeType viele andere Verhaltensweisen gibt (wir haben keine definiert und können sich nicht viel vorstellen), könnten Sie die KNN- und Flickr-Abstands-Algorithmen in separate Klassen verschieben. Wahrscheinlich keine Notwendigkeit.
Denken Sie daran: in OO, Unterklasse für Verhalten, nicht für Existenz. Und gib mir eine +1 Stimme!
Versuchen Sie so etwas?
%Vor%Vielleicht können Sie das Vorlagenmethodenmuster ausprobieren?
Basierend auf dem, was Sie über "Feature" geschrieben haben, würde ich sagen, dass dies als ein Feld in Ihrer ImageImageHyperEdge-Klasse geeignet wäre. Sie können eine FeatureType-Klasse mit den verschiedenen Elementen erstellen, die sie definieren.
%Vor%Tags und Links java inheritance oop interface