我应该将我的接口定义放在与其实现相同的命名空间中

时间:2012-03-20 20:12:05

标签: c# interface

如果我定义了一个接口ITestInterface,然后立即创建一个实现该接口的类以便在应用程序中使用,那么可以将类和接口保持在同一名称空间中,也可以将它们分开。即Test.InterfacesTest.Interfaces.Implementation

我的界面和它的实现都将在它自己的程序集中,所以我不想创建另一个只是为了包含接口本身。

这与c#特别相关,但我想它可以涵盖任何语言。

7 个答案:

答案 0 :(得分:19)

使用.NET预定义类的既定约定可能更好。例如,查看System.Collections.Generic命名空间,我们可以看到IDictionaryDictionary都存在。因此,将它们放在同一名称空间中是最好的主意。

此外,由于接口和实现都很可能用于相同的目的,因此最好将它们分组到同一名称空间中。

答案 1 :(得分:3)

单独的程序集,相同的命名空间怎么样?我喜欢它。

答案 2 :(得分:2)

System.Collections.ArrayList实现System.Collections.IList。如果微软这样做了,你为什么不呢?

答案 3 :(得分:2)

这是一个非常抽象的问题。接口的原因是什么?它是公共API /框架还是简单的应用程序?您是否会有多个相同接口的实现?

如果接口在它们自己的程序集中,那么基本名称空间匹配程序集名称是一种很好的做法。但听起来你的意思是类和接口在同一个程序集中。

答案 4 :(得分:2)

  

这与c#特别相关,但我想它可以覆盖任何   语言。

在Java中,将两者放在同一个包中是典型的。我能想到的一个例外可能是包持久性中的DAO接口以及其下的子包中的不同实现(例如jdbc,hibernate,jdo等)

您可以将公共接口视为从程序包中公开的API。我可以看到实现类可能是包私有的,阻止用户通过接口以外的任何其他方式访问实现。必须提供公共工厂方法来授予访问权限。

答案 5 :(得分:1)

这取决于目标。这里的许多答案都依赖于现有的MS库示例。没关系,这不一定是错误的,但是MS创建这些库的目标与创建业务应用程序的人或团队可能有不同的目标。

如果您的目标是依赖倒置(例如,作为Clean Architecture的一部分),则您的接口和实现将不在同一个命名空间中。

另请参阅:SOLID Principles

答案 6 :(得分:0)

你的意图是什么?

如果你希望从其他代码中“隐藏”实现和/或选择在运行时“注入”几个可用实现中的哪一个,那么你的课程不应该是公开的,所以它不会真正重要的是它所在的命名空间。

否则,驻留在同一名称空间中的接口和类都没有问题。