Ich habe eine, abstract class A
die eine abstrakte Methode deklariert doStuff
. Derzeit gibt es viele Klassen, die von erben A
und diese implementieren doStuff
.
Die Instanzen der Klasse werden zur Laufzeit über AFactory
basierend auf Benutzereingaben initialisiert . Ursprünglich hatten alle Klassen den gleichen Parameter (die Benutzereingabe). Aber jetzt habe ich einen zusätzlichen Parameter, den nur eine neue Klasse, die erbt, A
benötigt.
Also habe ich mir die folgende Logik überlegt:
Die Interpreter-Klasse, die Instanzen basierend auf Benutzereingaben generiert (
AFactory
natürlich unter Verwendung), kannte diesen zusätzlichen Parameter nicht.- Der Versuch, es in die Klasse der Klassendolmetscher zu schieben, wäre wirklich umständlich, denn dann müsste ich wissen, wann ich es an die Fabrik weitergeben muss, was den ganzen Zweck, überhaupt eine Fabrik zu haben, zunichte macht.
- Es blind in die Fabrik zu schicken, in der Hoffnung, dass es etwas damit anfangen könnte , scheint ebenfalls ziemlich hässlich.
Meine aktuelle Lösung: Inzwischen habe ich refactor beschlossen
A.doStuff(Param param)
inA.doStuff(AParams params)
.AParams
kann alle benötigten Parameter enthalten unddoStuff
kann sie dann ignorieren, wenn sie nicht an ihnen interessiert sind. Dies scheint mir auch etwas umständlich zu sein und verhindert, dass ich Strukturen in WIN32API sende, die viele hässliche nutzlose Parameter enthalten können, und ich mag es nicht.
Gibt es eine elegantere Möglichkeit, dieses Problem anzugehen? Oder ein Designmuster, das ich übersehen und gelöst habe?
Anmerkungen :
- Wir verwenden Java 1.7
- Die Namen der Klassen sind albern, um das theoretische Designproblem hervorzuheben. Sie haben in der Realität normale indikative, bedeutungsvolle Namen :)
- Ich habe die Suche ziemlich viel , aber habe herausgefunden, dass es ziemlich schwierig ist , das Web nach bestimmten abstrakten theoretischen Fragen zu suchen (im Gegensatz zu , warum
X
wirftException
in diesem Code) Ich habe beschlossen , auf jeden Fall zu fragen , so tut mir leid , wenn dies eine ist Duplikat.
Bearbeiten 1 :
- Klarstellung: Ich muss der
doStuff
Methode ein unterklassenspezifisches Argument übergeben .
EDIT 2 :
Ich habe die Absicht von Kilian Foth nicht vollständig verstanden, deshalb habe ich Java-Pseudocode geschrieben, um das Problem besser zu erklären / Ihre Lösung zu verstehen. Damit:
Dies ist ein Grundgerüst meines Problems.
Dies ist ein Grundgerüst meiner Lösung.
Dies ist meiner Meinung nach die Lösung von Kilian Foth, aber ich bin mir nicht sicher.
EntryPoint
Aufruf bekannt, main
der dann einige aufruft, Interpreter
die derzeit den zusätzlichen Parameter nicht als Parameter erhalten, ebenso wie die Factory. Der zusätzliche Parameter stammt von einer anderen Art von Benutzereingabe, die nicht von beschrieben wird UserInput
(was ich leider nicht ändern kann).
doStuff
Methode ein unterklassenspezifisches Argument übergeben müssen ?