为什么静态类不能实现接口?

可能重复:
为什么不C#允许静态方法来实现一个接口?

在我的应用程序中,我想使用一个存储库来完成原始数据访问(TestRepository,SqlRepository,FlatFileRepository等)。 因为在我的应用程序的整个运行时间中都会使用这样一个存储库,所以对我来说这似乎是一个明智的做法,所以我可以去

SqlRepository.GetTheThingById(5); 

没有它必须一直重新生成。 因为我希望我的存储库可以互换,所以我想让他们实现一个通用接口:IRepository。 但是当我试图这样做,我得到了

 "Static classes cannot implement interfaces" 

为什么他们不能? 你怎么build议我改变我的devise呢? 有我可以使用的模式吗?

UPDATE
五年之后,这个问题被访问了20多次,我了解了存储库模式的缺点,了解了IoC,意识到我的问题制定得不好。

我没有真正问过接口的C#规范是什么,而是为什么它故意以这种特定的方式限制我。

实际的答案是调用实例或types的方法的语法是不同的。 但问题是closures的。

接口不能有静态方法。 实现接口的类需要将它们全部实现为实例方法。 静态类不能有实例方法。 QED。

也许我们的经验会有帮助。 而不是SqlRepository作为静态类,我们使用AutoFac进行注入,并将容器隐藏在静态类的后面。 那么每个实体都有一个静态存储库属性:

 public class Part : inheritence... { public static IPartRepository Repository { get { return IoCContainer.GetInstance<IRepository<Part>>(); } } // ... more part-y stuff } 

通过这种方式,我们可以交换实现,并且调用者总是知道从哪里得到它:

 Part p = Part.Repository.Get(id); 

在另一个项目中有一个PartRepository注册到容器中:

 public class PartRepository : IPartRepository { // IPartRepository implementation that talks to injected DAL } 

在另一个项目中,我们嘲笑testing,包括预先载入已知条目的存储库:

 public class MockPartRepository : Dictionary<Part, int>, IPartRepository { // IPartRepository implementation based on dictionary } 

…并在容器中进行unit testing。 SAME调用获取存储库:

 Part p = Part.Repository.Get(id); 

根据定义,接口为实例创build合同。 既然你不能实例化一个静态类,静态类不能实现接口。

没有必要有一个静态库。 只需将其设置为非静态,并在需要时将其实例化。