【发布时间】:2018-11-17 00:30:37
【问题描述】:
我正在编写一个程序来向用户显示一组问题,收集他的回答并打印出来。
根据他们需要的回答类型,我有不同类型的问题:整数、布尔值或文本。
我开始写这段代码:
abstract class Question
{
string text;
}
class IntegerQuestion : Question
{
int response;
}
class TextQuestion : Question
{
string response;
}
class BooleanQuestion : Question
{
bool response;
}
好吧,现在我们必须打印问题和回答。
我的第一个方法是在 Question 类中定义一个新的抽象 Print 函数来强制子类定义 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 { ... }
¿问题子类不是因为知道如何以纯文本和 html 格式打印而违反 SRP 吗?
【问题讨论】:
标签: solid-principles single-responsibility-principle open-closed-principle