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

问题描述 投票:14回答:7

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

我的接口及其实现都将在其自己的程序集中,因此我不想创建另一个仅包含接口本身的接口。

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

c# interface
7个回答
20
投票

最好使用.NET预定义类的已建立约定。例如,在System.Collections.Generic命名空间中,我们可以看到IDictionaryDictionary都在那里。因此,最好将它们放在相同的名称空间中。

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


3
投票

单独的程序集,相同的名称空间如何?我喜欢。


2
投票

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


2
投票

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

如果接口在其自己的程序集中,则基本名称空间匹配程序集名称是一种好习惯。但听起来您的意思是类和接口在同一程序集中。


2
投票

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

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

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


0
投票

你的意图是什么?

[如果您希望在代码的其余部分“隐藏”该实现和/或选择在运行时“注入”几个可用的实现中的哪个,那么您的类无论如何都不应是公共的,因此不要它驻留在哪个名称空间中确实很重要。

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


0
投票

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

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

另请参见:SOLID Principles

© www.soinside.com 2019 - 2024. All rights reserved.