Java:スーパークラスから派生できるサブクラスインスタンスの機能を定義する方法
-
26-10-2019 - |
質問
私の質問をより具体的にするために、それを問題としてポーズさせてください:
状況の説明:
3つの抽象的な概念があります。
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
実装/サブタイプには、さまざまな種類のワーカーとさまざまな種類のタスクがあります。特定のタイプのワーカーは、特定のタイプのタスクを実行できます(すべてのタイプのサブセット)
解決する問題
現在、ボスには、実行されたいと思っている既知のタイプのタスクがあります。労働者はどのようなインターフェイスを実装できますか?ボスは何をすることができますか?
私が考えることができるそれを解決する方法
私はこの2つの方法を見つけましたが、おそらく他のより良い方法があります:
1)空のタスクインターフェイスを実装するすべてのタスクタイプのクラスを作成します。ワーカーに実行(タスク)関数を与えます:実行の実装(タスク)では、タスクをタイプチェック/キャストして、そのタイプのワーカーが実行できるすべてのタスクタイプにタスクをキャストします。 TypeChecksが通過しない場合、Tasknotsupportedexceptionを投げます。上司は、例外が投げかけられないまで労働者にタスクを与えることができます。
2)タスククラスはありませんが、関数DotaskType(taskInfo)を使用したすべてのタスクタイプの機能インターフェイスを定義します。ワーカーの実装は、その機能に依存する機能インターフェイスを実装できます。ボスは、適切な能力を持つ労働者が見つかる(タイプチェック)まで確認し、それを実行できることを知ってタスクを彼に与えることができます。
私はテスト2をテストしませんでしたが、Javaでそれほど多くの経験はありませんが、これは可能である(または非常によく似たもの)。
また、1は不適切(キャストのカスケード)とインターフェイスがクラスのインスタンスができることを定義する自然な方法であり、機能をグループ化/階層を作成できるインターフェイスでも定義するための自然な方法であるため、1以上を好みます。 (また、現在の実装では(1)タスクインターフェイスが空になっているため、タスクにはあまり共通点がなく、情報がコンストラクターに渡され(これは方法2の関数のパラメーターになります)、GetSによって取得されます。
私は、これを実装/(1つまたは2を調整する)他の方法で、またはあなたが好む2つのうちのどれか、そしてその理由で、私は疑問に思っていました。 (効率は重要ではありません。変調/抽象化/保守性は!)
解決
これに例外を使用しないでください。例外は例外的な状況に使用されるべきであり、何らかのタスクを実行できないことは正常であるようです。
メソッドを追加します
boolean isAbleToExecute(Task task)
労働者のクラスでは、上司に労働者を繰り返してもらい、作業員がタスクを割り当てる前に実行できることを見つけます。
他のヒント
ワーカーインターフェイスには、タスクのリストを返すメソッドサポートテスクを含めることができます。その後、マップ、マッピングタスクを維持し、そのタスクをサポートする労働者のリストにマッピングすることができます。その後、上司は反復する必要はありませんが、特定のタスクをサポートするすべての労働者を調べることができます。