【问题标题】:Should i implement all the interfaces in one class or make one class for each one?我应该在一个类中实现所有接口还是为每个类创建一个类?
【发布时间】:2019-06-13 14:42:32
【问题描述】:

我的任务是建立一个自我评估测试评分器。老师给了我们测试接口:

和问题界面:

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

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

public class CTest implements ITest,ITestStatistics {}

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

我尝试了第一种方法,但我得到了错误,因为有同名的方法。

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

【问题讨论】:

  • 用例描述很重要。它说什么?它如何指定应该这样做?该计划的总体目的是什么?
  • "我尝试了第一种方法,但我得到了错误,因为有相同名称的方法。" -- 如果接口对方法的要求有冲突 -- 它看起来就像他们一样——那么这几乎可以回答问题的那一部分。但我认为您不需要任何直接实现IQuestion
  • @lealceldeiro 在最终结果中应该是这样的imgur.com/a/iTOTVT5

标签: java interface


【解决方案1】:

在测试接口的情况下,我不明白为什么你不能(乍一看),我认为你应该实现这两个接口。

在问题接口的情况下,正如您所发现的,方法签名中存在不兼容性。由于IQuestionMultipleChoiceIQuestionNumericIQuestionYesNo 都扩展了IQuestion,因此您只需实现前三个之一。正如@john-bollinger 在 cmets 中指出的那样,如果您实现了三个配音接口之一,则无需实现IQuestion

我认为你也应该实现IQuestionMetaData,类似的东西

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

【讨论】:

    【解决方案2】:

    我不知道我是否应该在一个课程中实现所有这些 [...] 或者我是否应该为每种问题类型做一个课程。

    我尝试了第一种方法,但我得到了错误,因为有相同名称的方法

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

    由于IQuestion 具有获取和设置元数据的方法,因此对于上述任何类来说实现IQuestionMetaData 似乎都没有用处。肯定应该有一个单独的类。

    同样,ITest 具有添加和删除IQuestions 和提供ITestStatistics 的方法,因此看起来前者的典型实现不会同时实现后者。那么,ITestITestStatistics 似乎也应该有单独的实现。

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

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


    重要提示:

    您说您的工作是实施评分器,但以上都不是似乎是评分器实施的一部分。相反,这些界面似乎描述了您的评分者将操作的主题。这并不一定意味着您不需要实现这些接口,但您应该在投入工作之前确保这一点。从我的角度来看,您完全有可能在您的分级器实现中依赖接口,而不是提供您自己的实现。

    【讨论】:

    • 两个问题: 1- 在 ITest 实现中 addQuestion 方法的内容是什么? 2-如果我应该实施和“IQuestion”类,我没有从你的解释中得到。我认为没有必要,因为该接口的方法自动在其他 3 个类中。 PS:也许 Grader 不是正确的术语。基本上,我们在一个 json 文件中给出了一组问题,并且从中,程序需要能够识别它是什么类型的问题,并为该问题类型加载特定的测试窗口。最终结果应该是这样的imgur.com/a/iTOTVT5
    • @BrunoCunha, 1. 我不知道 你的导师 的意图是什么,但我对阅读方法签名的期望是该方法将提供的 Question 存储在某种内部数据结构——也许是List
    • 2.我在第一段的后半部分讨论了这个问题。似乎没有必要提供IQuestion 的直接实现,但您可能会发现提供一个用作实现其他三个问题接口的超类有用
    猜你喜欢
    • 1970-01-01
    • 2019-09-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 2014-10-10
    • 1970-01-01
    • 2021-02-03
    • 1970-01-01
    相关资源
    最近更新 更多