我应该在一个类中实现所有接口还是为每个类创建一个类?

时间:2019-06-13 14:42:32

标签: java interface

我有一个任务来建立一个自我评估测试分级机。老师给了我们测试界面:

Test interface UML diagram

和问题界面:

Question interface UML diagram

实现,我不知道是否应该像这样在一个类中全部实现它们:

public class CQuestion implements IQuestion, IQuestionMultipleChoice,
        IQuestionNumeric, IQuestionYesNo,IQuestionMetadata {}

public class CTest implements ITest,ITestStatistics {}

或者我是否应该为每种问题类型做一堂课。

我尝试了第一种方法,但由于有些方法具有相同的名称,因此我会出错。

我想尝试第二种方法,但是我不知道该怎么做。我知道我必须在测试类中创建一个问题对象,但是我不知道是否必须为每种问题类型创建一个对象。

2 个答案:

答案 0 :(得分:0)

对于测试接口,我不明白为什么不能(乍一看),我认为您应该同时实现这两个接口。

对于问题接口,如您所知,方法签名不兼容。由于IQuestionMultipleChoiceIQuestionNumericIQuestionYesNo都扩展了IQuestion,因此您只需要实现前三个之一即可。正如@ john-bollinger在评论中指出的那样,如果您实现三个dub接口之一,则无需实现IQuestion

我认为您还应该实现IQuestionMetaData,类似这样

public class CQuestionYesNo implements IQuestionYesNo, IQuestionMetaData {
... // your code here
}

答案 1 :(得分:0)

  

我不知道我应该在一个类中全部实现它们,还是应该为每种问题类型都做一个类。

     

我尝试了第一种方法,但由于存在相同名称的方法而出现错误

...和参数,但返回类型不同。那么,让我们在这里应用一些简单的逻辑:如果两个接口有冲突的要求,那么它们不能都由同一个类实现。因此,似乎必须存在实现IQuestionMultipleChoiceIQuestionNumericIQuestionYesNo的单独的具体类。因为所有这些接口都扩展了IQuestion,所以每个实现也都必须实现IQuestion,因此似乎并不需要固有的实现。但是,为其他直接实现IQuestion的其他人提供基类是很自然的。

由于IQuestion具有获取和设置元数据的方法,因此对于上述任何类实现IQuestionMetaData似乎都不有用。当然应该为此设置一个单独的类。

类似地,ITest具有添加和删除IQuestion并提供ITestStatistics的方法,因此似乎前者的典型实现也不会实现后者的任何一种。这样看来,ITestITestStatistics也应该有单独的实现。

  

我想尝试第二种方法,但是我不知道该怎么做。我知道   我必须在测试类中创建一个问题对象,但是我没有   知道我是否必须为每种问题类型创建一个对象。

为什么ITest实现需要创建问题对象?它具有使单独的对象可以添加和删除问题的方法。我没有理由认为测试应该能够提出自己的问题。


重要提示:

您说您的工作是实施评分器,但是以上任何一个似乎都不是评分器实施的一部分。这些界面似乎描述了您的评分员将要从事的工作。这并不一定意味着您不希望实现这些接口,但是在进行工作之前,应确保已实现。从我的角度来看,完全有可能期望您依靠评分器实现中的接口,而不是自己提供它们的实现。