Не являются подклассами вопросов, нарушающими SRP, потому что они знают, как печатать их в виде обычного текста и HTML
Вы совершенно правы.
Во-первых, в соответствии с вашим соглашением об именах и дизайном, если я понимаю вашу демонстрацию, почему ответы расширяются Question
?Наследование - это отношение «есть» между объектом.
Должны ли мы сказать, что ответ - это вопрос?Похоже, что в вашем бизнесе есть две разные концепции:
- Вопрос, на котором стоит вопрос
- Ответ, на котором содержится ответ пользователя на вопрос
IВозможно, вы сделаете что-то вроде: (простите за синтаксис, это какой-то псевдокод)
interface IAnswer{
string toString();
}
class IntegerAnswer implements IAnswer{
int answer;
string toString(){
return (string)this.answer;
}
}
....
class Question{
string text;
IAnswer answer; //or List<IAnswer> answers if you can old more than one answer by Question
string toString(){
return this.text;
}
}
Затем вы можете определить принтер:
interface IQuestionPrinter{
string print(List<Question> questions);
}
class Printer implements IQuestionPrinter{
string print(List<Question> questions){
string res = '';
foreach(question in questions){
res+=question.toString() + " : " + question.answer.toString();
}
return res;
}
}
class HTMLPrinter implements IQuestionPrinter{
string print(List<Question> questions){
string res = "<ul>";
foreach(question in questions){
res+="<li>";
res+= "<span>" + question.toString() + "</span>";
res+="<span>" + question.answer.toString()+"</span>;
res+="</li>";
}
return res+"</ul>";
}
}
Или что-то вродетот.
Тогда все ваши Вопросы и Ответы знают о том, что им необходимо расширить метод toString (), и мы делегируем работу печати выделенному IQuestionPrinter.
Создание интерфейса ответа - это хорошо, поскольку принтеру не нужно было знать, является ли ответ целочисленным, логическим, строковым или каким-либо другим.И если у вас есть другие «типы» Вопроса, вы должны определить интерфейс IQuestion:
interface IQuestion{
IAnswer answer; // or List<IAnswer> answers
string toString();
}
И тогда IQuestionPrinter должен принять это во внимание:
interface IQuestionPrinter{
string print(List<IQuestion> questions);
}