针对只有一个类实现所述接口的接口进行编程
本文关键字:接口 编程 有一个 实现 | 更新日期: 2023-09-27 17:57:25
我能理解为什么要针对接口而不是实现进行编程。然而,在下面这样的例子中(我发现了很多):
public interface ISomething
{
void BlahOne(int foo);
void BlahTwo(string foo);
}
public class BaseSomething : ISomething
{
public void BlahOne(int foo)
{
//impl
}
public void BlahTwo(string foo)
{
//impl
}
}
public class SpecificSomethingOne : BaseSomething
{
public void SpecificOne()
{
//blah
}
}
public class SpecificSomethingTwo : BaseSomething
//and on..
目前的例子是我的游戏中基于组件的实体系统。(我有IComponent、Component、PosComponent等)。
然而,我看不出有什么理由拥有ISomething。这个名字可能看起来更好,但似乎没有什么目的。我可以一直返回BaseSomething。
当你有一个所有东西都使用的单一基础实现时,有理由拥有一个接口吗?(例如,我可以看到IComparable或IEnumerable的用途)
编辑:对于一个稍微不同的场景(但仍然足够相关,不需要不同的问题),如果我假设我对所有事情都有这种结构,那么与BaseSomething
相比,如果我对参数类型和变量使用ISomething
,会有很大的区别吗?
我更喜欢"懒惰设计"-在需要时从BaseSomething
中提取接口。在此之前,请保持简单并跳过它。
现在,当只有一个实现时,我可以想到拥有接口的两个原因:
- 单元测试还有另一个模拟实现(即有第二个实现,尽管不是在生产代码中)
- 接口和实现是在不同的类库中定义的。例如,当使用模型视图演示者模式时,视图可以位于.exe项目中,该项目依赖于实现演示者的.dll。然后,IView接口可以放在.dll中,演示者对通过依赖项注入提供的视图的引用
问题的正确答案是"这取决于"。
你可以用很多不同的方式来看待它,这一切都是关于视角的。当你有一个具体或抽象的基类时,这意味着你的对象在功能上有一些共同点。派生对象在某种程度上是相互关联的。接口只允许您确认功能契约,其中实现接口的每个对象将负责实现。
同样,当您再次编程接口时,您严格了解对象的功能,因为它实现了给定的接口。您不必担心每个对象在功能上是如何实现这一点的。
如果我说你的每一件物品都是完全在实现接口ISomething,假设SpecificSomethingOne和SpecificSomehingTwo不是从BaseSomeThing派生的,并且每个都实现自己的ISomethinng。
你可以在同一件事上参考这个答案。
这并不是真正必要的,但如果您以后想扩展程序或想实现另一个基类,这是一个更好的设计。在您的情况下,我不会实现基类。如果你不想有一个默认的行为,接口只是很好的。如果您想要默认行为,那么只需编写不带接口的基类
如果你的BaseSomething是抽象的,并且你实现了特定的东西,提供者重载到抽象方法,那么在这一点上对它们进行编程的唯一方法就是ISomething接口。然而,在您展示的示例中,实际上没有理由使用ISomething,除非您可以有多个基本实现。