java:如何定义可以从超类派生的子类实例的功能

时间:2011-04-28 17:05:17

标签: java interface capability

为了使我的问题更具体,让我把它作为一个问题:

情况描述:

我们有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

在实现/子类型中,我们有许多不同类型的工作者和不同类型的任务。 特定类型的工作人员可以执行某些类型的任务(所有类型的子集)

要解决的问题

现在老板有一个他想要执行的已知类型的任务,他不知道他拥有的工人类型(只有抽象类型/接口)。 工人可以使用什么样的界面/老板可以找到什么?

我能想到的解决问题的方法

我发现了这两种方式,但可能还有其他更好的方法:

1)我们为实现空任务接口的每个任务类型创建一个类 给工人一个执行(任务)功能: 在execute(task)的实现中,尝试对工作类型可以执行的所有任务类型进行类型检查/强制转换。如果没有一个类型检查通过,我们抛出一个taskNotSupportedException。 老板现在可以向工人提供任务,直到没有异常被抛出。

2)我们现在没有任务类但是 使用函数dotaskType(taskinfo)为每个任务类型定义一个功能接口 工作器实现现在可以根据其功能实现功能接口。 老板现在可以检查,直到找到具有适当能力的工人(类型检查) 然后告诉他任务,知道他可以执行它。

我没有测试2,我在java中没有那么多经验,但这应该是可能的(或者非常类似的东西)。

我也更喜欢2比1,因为1似乎不合适(级联的强制转换)和接口是定义类的实例可以做什么的自然方式,也可以使用可以对功能/创建层次结构进行分组的接口。 (同样在我当前的实现中(1)Task接口是空的,因此任务没有太多共同之处,info通过构造函数(它是方法2中函数的参数)传递并通过gets检索。

我想知道你会以什么方式/可以实施(调整1或2?)这个或两个你喜欢哪个以及为什么。 (效率并不重要,调制/抽象/可维护性是!)

2 个答案:

答案 0 :(得分:2)

不要为此使用例外。异常应该用于特殊情况,而不能执行某些任务似乎是正常的。

我会添加一个方法

boolean isAbleToExecute(Task task)

在Worker类中,让老板遍历他的工作人员并找到一个能够在分配任务之前执行任务的工人。

答案 1 :(得分:0)

Worker接口可以包含一个supportedTasks返回任务列表的方法。然后,您可以维护Map,将任务映射到支持该任务的工作人员列表。然后你的老板不需要迭代,但可以简单地查找支持给定任务的所有工人。