Erweitern einer Klasse, die von einer anderen Klasse instanziiert wird

8

Ich arbeite mit einer Java-API, die für "Makros" verwendet wird, die ein Stück Software automatisieren. Die API hat unter anderem die Klassen Simulation (ein globaler Zustand von Art) und FunctionManager . Ich kann nichts tun, um diese Klassen zu ändern.

Ich möchte eine BetterFunctionManager -Klasse machen, die extends FunctionManager enthält, weil letzterer einige nützliche Funktionen fehlen. Aber ich weiß nicht, wie das geht, weil FunctionManager nicht direkt instanziiert werden kann. Es muss von Simulation wie folgt erhalten werden:

%Vor%

Beachten Sie, dass Simulation auch nicht direkt instanziiert werden kann. es muss über getCurrentSimulation() abgerufen werden (die aktuelle Simulation wird zur Laufzeit vom Makrointerpreter bestimmt).

Ich kann nicht niederschlagen; Folgendes wirft eine ClassCastException:

%Vor%

Wie kann ich BetterFieldFunctionManager erstellen?

    
Jean-François Corbett 29.05.2013, 12:37
quelle

3 Antworten

4

Haftungsausschluss: Ich bin immer noch sehr naiv in Sachen Design. Nur ein Vorschlag. Verwenden Sie das Delegierungsentwurfsmuster

%Vor%

Nachteile:

muss alle Methoden von FunctionManager umbrechen

Vorteil:

Es gibt keine Notwendigkeit, an einem anderen Ort zu ändern. Ändere einfach wie

%Vor%     
stinepike 29.05.2013, 13:16
quelle
2

Was Sie gefunden haben, ist bekannt als Das Ausdrucksproblem und ich fürchte, es ist Ihre vernünftigste Option, es anzugreifen pure Java ist StinePikes Vorschlag, Komposition und Delegierung zu verwenden

Wenn Sie in der Lage sind, das Tool für die Aufgabe auszuwählen, dann sollten Sie sich die Clojure-Protokolle ansehen. Sie bieten eine wirklich schöne Lösung für das Ausdrucksproblem (siehe sehr gute Erklärung hier Lösen des Ausdrucksproblems mit Clojure ) und wenn ich mich nicht irre, wenn du deine Lösung in clojure codierst, kannst du sie in eine Java-Klasse kompilieren und sie in deiner Java-App verwenden

    
Francisco Meza 29.05.2013 15:02
quelle
1

Da Ihre Optionen aufgrund der Klassenstrukturen begrenzt sind, können Sie eine FunctionManagerUtility-Klasse anstelle von BetterFunctionManager erstellen. In der FunctionManagerUtility-Klasse können Sie Methoden hinzufügen, um Ihre nützlichen Funktionen hinzuzufügen, indem Sie das FunctionManager-Objekt als Eingabe verwenden.

    
Juned Ahsan 29.05.2013 12:49
quelle

Tags und Links