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

时间:2009-08-12 14:12:25

标签: c# .net

  

可能重复:
  Why Doesn’t C# Allow Static Methods to Implement an Interface?

在我的应用程序中,我想使用将执行原始数据访问的存储库(TestRepository,SqlRepository,FlatFileRepository等)。 因为这样的存储库将在我的应用程序的整个运行时间中使用,所以我把它变成一个静态类似乎是一件明智的事情,所以我可以去

SqlRepository.GetTheThingById(5);

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

"Static classes cannot implement interfaces"

他们为什么不能? 你怎么建议我改变我的设计呢?有没有我可以使用的模式?

更新
五年后:这个问题被访问了20k +次,我了解了存储库模式的缺点,了解了IoC,并意识到我的问题制定得很差。

我并不是真的在问界面的C#规范是什么,而是为什么它故意以这种特定的方式限制我。

实际的答案是,在实例或类型上调用方法的语法是不同的。但问题已经结束。

3 个答案:

答案 0 :(得分:40)

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

答案 1 :(得分:17)

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

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
}

在另一个项目中,我们有测试的模拟,包括预加载已知entires的存储库:

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

...它已在容器中注册以进行单元测试。 SAME调用获取存储库:

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

答案 2 :(得分:11)

根据定义,接口为要实现的实例创建合同。由于无法实例化静态类,因此静态类无法实现接口。

无需拥有静态存储库。只需将其设置为非静态,并在需要时进行实例化。