2 Stimmen

List<Object> abcList und Methode Überladung

Ich frage mich, ob es einen Shortcut für mein aktuelles Problem gibt.

Ich habe eine Liste abcList.

Sie enthält 3 Arten von Objekten/Entitäten A B C (sie haben keine gemeinsame Schnittstelle oder Elternklasse, mit Ausnahme von Object).

Sie sind Hibernate-Entitäten.

Ich habe 3 überladene Methoden.

prozess(A a)
prozess(B b)
prozess(B C)

Ich hatte gehofft, einfach die

List abcList zu durchlaufen und process(); aufzurufen;

for(Object o: abcList) process(o);

Gibt es eine einfache Lösung für mein aktuelles Problem? Ich implementiere eine Klasse, die eine Liste mit 3 verschiedenen Typen von Objekten enthält.

3voto

Luciano Punkte 8392

Da die Bindung zur Kompilierungszeit erfolgt, ist es unmöglich zu wissen. Wenn Sie eine Schnittstelle zu diesen Klassen hinzufügen können, können Sie das Besucher-Muster verwenden.

1voto

Tom Hawtin - tackline Punkte 142461

Neben dem Besucher-Muster ist es auch wichtig, eine Schicht der Indirektion hinzuzufügen, wenn Sie der Liste etwas hinzufügen. Anstatt das Objekt direkt einzufügen, fügen Sie ein Objekt ein, das prozessieren kann und Referenzen sowohl auf das Objekt als auch auf den äußeren Kontext hat.

0voto

Edward Samson Punkte 2345

Dies ist ein guter Ort, um das Besucher-Muster zu verwenden. Ohne auf Reflexion zurückzugreifen, müssen Sie eine gemeinsame Schnittstelle für die Objekte in Ihrer Liste definieren. Fangen wir damit an:

Schnittstelle Visitable {
    void accept(Visitor v);
}

Der Besucher ist dann der Ort, an dem Sie die Prozessmethoden für jeden konkreten Typ definieren:

Schnittstelle Visitor {
    void process(A a);
    void process(B b);
    void process(C c);
}

Jetzt ist ein konkretes Visitable in der Lage, die richtige Überladung von process() aufzurufen, da es natürlich zur Kompilierzeit seinen eigenen konkreten Typ kennt. Zum Beispiel:

Klasse A implementiert Visitable {
    void accept(Visitor v) {
        v.process(this);
    }
}

Klassen B und C werden dasselbe tun. So landen Sie schließlich bei Ihrer Verarbeitungsschleife:

List abcList = ...;
Visitor visitor = ...;

for (Visitable o : abcList) {
    o.accept(visitor);
}

Wenn Sie weiterhin keine gemeinsame Schnittstelle für alle Ihre Klassen definieren können, können Sie dies auch mit dem Besucher-Muster unter Verwendung von Reflexion erreichen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X