Я не знаю, должен ли я реализовать их все в одном классе [...] или я должен сделать один класс для каждого типа вопроса.
Я попробовал первыйПодход, но я получаю ошибки, потому что есть методы с тем же именем
... и аргументы, но разные типы возвращаемых данных.Давайте теперь применим некоторую простую логику: если два интерфейса имеют противоречивые требования, то они не могут быть реализованы одним и тем же классом.Таким образом, похоже, что должны быть отдельные конкретные классы, реализующие IQuestionMultipleChoice
, IQuestionNumeric
и IQuestionYesNo
.Поскольку все эти интерфейсы расширяют IQuestion
, каждая из этих реализаций также обязательно будет реализовывать IQuestion
, поэтому, похоже, нет необходимости в отдельной реализации этого.Тем не менее, было бы вполне естественно иметь базовый класс для других, который непосредственно реализует IQuestion
.
Поскольку IQuestion
имеет методы для получения и установки метаданных, он не выглядит как полезныйдля любого из вышеупомянутых классов реализовать IQuestionMetaData
.Для этого, безусловно, должен быть отдельный класс.
Точно так же, ITest
имеет методы для добавления и удаления IQuestion
s и для предоставления ITestStatistics
, поэтому не похоже, что типичная реализация первоготакже будет реализовывать любой из последних.Похоже, что также должны быть отдельные реализации ITest
и ITestStatistics
.
Я хочу попробовать второй подход, но я не знаю, как это сделать.Я знаю, что должен создать объект вопроса внутри тестового класса, но я не знаю, нужно ли мне создавать один объект для каждого типа вопроса.
Зачем нужна реализация ITest
создать вопрос объектов?У него есть методы, с помощью которых отдельный объект может добавлять и удалять вопросы.Я не вижу оснований полагать, что тест может создавать свои собственные вопросы.
Важное примечание:
Вы сказали, что ваша задача заключается в реализации Грейдер , но Ни один из вышеперечисленных не является частью реализации грейдер.Похоже, что эти интерфейсы описывают предмет, по которому будет работать ваш грейдер.Это не обязательно означает, что вы не должны реализовывать эти интерфейсы, но вы должны убедиться в этом, прежде чем приступить к работе.С моей точки зрения, вполне возможно, что вы будете полагаться на интерфейсы в своей реализации грейдера, но не будете предоставлять свои собственные реализации.