Java: Wie man die Fähigkeiten einer Unterklasse -Instanz definiert, die aus der Superklasse abgeleitet werden kann

StackOverflow https://stackoverflow.com/questions/5822358

  •  26-10-2019
  •  | 
  •  

Frage

Um meine Frage konkreter zu machen, lassen Sie mich sie als Problem darstellen:

Situation Beschreibung:

Wir haben 3 abstrakte Konzepte:

Boss:  which has a number of employees
Worker:  that can execute some types of tasks
Task:  contains the semantics needed for a worker to execute it

In der Implementierung/Subtypen haben wir verschiedene Arten von Arbeitnehmern und verschiedene Arten von Aufgaben. Ein spezifischer Arbeitertyp kann bestimmte Arten von Aufgaben ausführen (Teilmenge aller Arten)

Problem zu lösen

Jetzt hat der Chef eine Aufgabe des bekannten Typs, die er hingerichtet sehen möchte. Er kennt nicht die Arten von Arbeitnehmern, die er hat (nur abstrakte Typ/Schnittstelle). Welche Art von Schnittstellen könnte der Arbeiter implementieren/was könnte der Chef tun, um es herauszufinden?

Möglichkeiten, es zu lösen, an die ich denken kann

Ich habe diese zwei Möglichkeiten gefunden, aber es gibt wahrscheinlich andere und bessere Möglichkeiten:

1) Wir erstellen eine Klasse für jeden Task -Typ, der die leere Task -Schnittstelle implementiert. Geben Sie dem Worker eine Funktion (Task): Versuchen Sie bei der Implementierung von Execute (Task), die Aufgabe zu tippen/zu übertragen, um alle Tasktypen zu typisieren, die diese Art von Worker ausführen kann. Wenn keiner der typtencks passt, werfen wir eine tasknotsupportedexception. Der Chef kann jetzt den Arbeitern Aufgaben erteilen, bis keine Ausnahme ausgelöst wird.

2) Wir haben jetzt keine Aufgabenklassen, sondern definieren eine Funktionsschnittstelle für jeden Aufgabentyp mit dem Funktion DotaskType (TaskInfo). Eine Worker -Implementierung kann jetzt die Funktionen implementieren, die von ihren Funktionen abhängig sind. Der Chef kann nun überprüfen, bis ein Arbeiter mit der richtigen Fähigkeit gefunden wird (typecking) und ihm dann die Aufgabe geben, zu wissen, dass er ihn ausführen kann.

Ich habe 2 nicht getestet und habe nicht so viel Erfahrung in Java, aber dies sollte möglich sein (oder etwas sehr Ähnliches).

Ich bevorzuge auch 2 über 1, da 1 unangemessen zu sein scheint (Kaskade von Abgüssen) und Schnittstellen sind eine natürliche Möglichkeit, zu definieren, was eine Instanz einer Klasse tun kann, auch mit Schnittstellen, die Sie Funktionen gruppieren/Hierarchien erstellen können. (Auch in meiner aktuellen Implementierung (1) ist die Task -Schnittstelle leer, sodass die Aufgaben nicht viel gemeinsam haben und die Informationen durch den Konstruktor (was Parameter von Funktionen in Methode 2) weitergegeben und durch GET abgerufen wären.

Ich habe mich gefragt, auf welche Weise Sie diese oder welche der beiden Sie bevorzugen würden/könnten (1 oder 2?), Und welche der beiden bevorzugen und warum. (Effizienz ist nicht wichtig, Modulation/Abstraktion/Wartbarkeit ist!)

War es hilfreich?

Lösung

Verwenden Sie dafür keine Ausnahmen. Ausnahmen sollten für außergewöhnliche Situationen verwendet werden, und nicht in der Lage zu sein, eine Aufgabe auszuführen, scheint normal zu sein.

Ich würde eine Methode hinzufügen

boolean isAbleToExecute(Task task)

In der Arbeiterklasse und lassen Sie den Chef durch seine Arbeiter iterieren und einen Arbeiter finden, der die Aufgabe ausführen kann, bevor Sie sie zuweisen.

Andere Tipps

Die Worker -Schnittstelle könnte eine Methode unterstützt, die eine Liste von Aufgaben zurückgibt. Anschließend können Sie eine Karte und die Zuordnungsaufgabe beibehalten, um diese Aufgabe zu unterstützen. Dann muss Ihr Chef nicht iterieren, kann aber einfach alle Arbeitnehmer nachschlagen, die eine bestimmte Aufgabe unterstützen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top