Должен ли я реализовать все интерфейсы в одном классе или сделать один класс для каждого? - PullRequest
2 голосов
/ 13 июня 2019

У меня есть задание построить оценщика для самооценки. Учитель дал нам тестовые интерфейсы:

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 голосов
/ 13 июня 2019

Я не знаю, должен ли я реализовать их все в одном классе [...] или я должен сделать один класс для каждого типа вопроса.

Я попробовал первыйПодход, но я получаю ошибки, потому что есть методы с тем же именем

... и аргументы, но разные типы возвращаемых данных.Давайте теперь применим некоторую простую логику: если два интерфейса имеют противоречивые требования, то они не могут быть реализованы одним и тем же классом.Таким образом, похоже, что должны быть отдельные конкретные классы, реализующие IQuestionMultipleChoice, IQuestionNumeric и IQuestionYesNo.Поскольку все эти интерфейсы расширяют IQuestion, каждая из этих реализаций также обязательно будет реализовывать IQuestion, поэтому, похоже, нет необходимости в отдельной реализации этого.Тем не менее, было бы вполне естественно иметь базовый класс для других, который непосредственно реализует IQuestion.

Поскольку IQuestion имеет методы для получения и установки метаданных, он не выглядит как полезныйдля любого из вышеупомянутых классов реализовать IQuestionMetaData.Для этого, безусловно, должен быть отдельный класс.

Точно так же, ITest имеет методы для добавления и удаления IQuestion s и для предоставления ITestStatistics, поэтому не похоже, что типичная реализация первоготакже будет реализовывать любой из последних.Похоже, что также должны быть отдельные реализации ITest и ITestStatistics.

Я хочу попробовать второй подход, но я не знаю, как это сделать.Я знаю, что должен создать объект вопроса внутри тестового класса, но я не знаю, нужно ли мне создавать один объект для каждого типа вопроса.

Зачем нужна реализация ITestсоздать вопрос объектов?У него есть методы, с помощью которых отдельный объект может добавлять и удалять вопросы.Я не вижу оснований полагать, что тест может создавать свои собственные вопросы.


Важное примечание:

Вы сказали, что ваша задача заключается в реализации Грейдер , но Ни один из вышеперечисленных не является частью реализации грейдер.Похоже, что эти интерфейсы описывают предмет, по которому будет работать ваш грейдер.Это не обязательно означает, что вы не должны реализовывать эти интерфейсы, но вы должны убедиться в этом, прежде чем приступить к работе.С моей точки зрения, вполне возможно, что вы будете полагаться на интерфейсы в своей реализации грейдера, но не будете предоставлять свои собственные реализации.

0 голосов
/ 13 июня 2019

В случае тестовых интерфейсов я не понимаю, почему вы не смогли (на первый взгляд), и я думаю, что вы должны реализовать оба интерфейса.

В случае с интерфейсами вопросов, как вы выяснили, в сигнатурах методов есть несовместимости. Поскольку IQuestionMultipleChoice, IQuestionNumeric и IQuestionYesNo все расширяются IQuestion, вам нужно реализовать только одну из первых трех. Как отметил @ john-bollinger в комментариях, нет необходимости реализовывать IQuestion, если вы реализуете один из трех интерфейсов дублирования.

Я думаю, вы должны также реализовать IQuestionMetaData, с чем-то вроде этого

public class CQuestionYesNo implements IQuestionYesNo, IQuestionMetaData {
... // your code here
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...