Я пишу программу, чтобы показать пользователю набор вопросов, собрать его ответы и распечатать их.
У меня есть разные типы вопросов в зависимости от того, какой ответ они требуют: целочисленные, логические или текстовые.
Я начал писать этот код:
abstract class Question
{
string text;
}
class IntegerQuestion : Question
{
int response;
}
class TextQuestion : Question
{
string response;
}
class BooleanQuestion : Question
{
bool response;
}
Что ж, теперь нам нужно распечатать вопросы и ответы.
Моим первым подходом было определение новой абстрактной функции Print в классе Question, чтобы подклассы определяли метод Print, а затем класс Printer:
abstract class Question
{
string text;
abstract string Print();
}
class Printer
{
string PrintQuestions(List<Question> questions)
{
string result = "";
foreach(var question in Questions)
result += question.Print() + "\r\n";
return result;
}
}
Другой подход, о котором я подумал, заключался в том, чтобы простить абстрактный метод и создать класс Printer следующим образом:
class Printer
{
string PrintQuestions(List<Question> questions)
{
string result = "";
foreach(var question in Questions)
{
if(question is IntegerQuestion)
{
var integerQuestion = (IntegerQuestion)question;
result += integerQuestion.text + integerQuestion.response;
}
if(question is TextQuestion)
{
...
}
...
}
return result;
}
}
Очевидно, что второй подход не соответствует классу OCP for Printer, а первый использует его.
Но как насчет SRP?
Если тогда мне нужно написать вопросы и ответы в HTML:
abstract class Question
{
string text;
abstract string Print();
abstract string PrintHTML();
}
class HTMLPrinter { ... }
¿Разве подклассы вопросов не нарушают SRP, потому что они умеют печатать их в виде обычного текста и HTML?