需要区分接口和类实际上表明存在设计缺陷。在设计良好的应用程序中,它总是很清楚。一个子类应该始终是一个专业化,并且类只能专注于一个学科,不能更多。
一个类应该有一个存在的理由。永远不应要求将次要角色放在基类中。例如:
public class XmlConfigurationFile : ConfigurationFile, IDisposable
{
}
public class YamlConfigurationFile : ConfigurationFile, IDisposable
{
}
第一个是Xml专用的配置文件,第二个是Yaml专用的配置文件。这些也是一次性的,但这并不重要。由于处理过程不同,您没有创建这两个类。
对比一下:
public class XmlConfigurationFile : IDisposable, ConfigurationFile
{
}
这将告诉您 XmlConfigurationFile 的主要目的是它是一次性的。您可以将其用作表示配置文件的一种方式,这很好,但只是次要的。
当您创建具有多种存在原因的类时,问题就开始了:
public class MyConfigurationFile : XmlConfigurationFile, YamlConfigurationFile
{
}
即使 XmlConfigurationFile 和 YamlConfigurationFile 本来是接口,它仍然表明设计不好。你的配置文件怎么能同时是Xml和Yaml呢?
如果您仔细阅读给出的示例(此处和其他地方),人们总是很难找到 I 前缀何时重要的好示例。这里的答案之一是:
public class Dog : Pet, Mammal
{
}
这就是这个类在一个关于宠物的应用程序中的样子。狗的主要目的是成为专门的宠物,可以做与宠物相关的事情,而不是哺乳动物。
public class Dog : Mammal, Pet
{
}
这是同一类在有关动物分类的应用程序中的外观。很高兴知道狗是宠物,但它的主要目的是成为一种专门的哺乳动物,可以做与哺乳动物相关的事情。
我认为您的课程应该告诉您有关应用程序架构和领域的正确故事。要求接口以“I”为前缀是一项技术要求,并不能帮助您更好地讲述应用程序的故事。
一旦您开始编写小型、专用、单一用途的类,了解它是实现还是扩展的需求将自动消失。