Why can static classes not implement interfaces?
Possible Duplicate:
Why Doesn’t C# Allow Static Methods to Implement an Interface?
在我的应用程序中,我希望使用一个可以进行原始数据访问的存储库(testprepository、sqlprepository、flatfilerepository等)。因为这样一个存储库将在我的应用程序的整个运行时使用,所以对我来说,把它变成一个静态类,这样我就可以去
1 | SqlRepository.GetTheThingById(5); |
不需要一直再生。因为我希望我的存储库可以互换,所以我希望它们实现一个公共接口:iRepository。但当我试着这么做的时候,我
1 | "Static classes cannot implement interfaces" |
他们为什么不能?那你建议我怎么改变我的设计?有我可以使用的模式吗?
更新五年后:这个问题被访问了2万次以上,我了解了存储库模式的缺点,了解了IOC,并且意识到我的问题没有很好的解决。
我不是真的在问接口的C规范是什么,而是为什么它故意以这种特定的方式限制我。
实际的答案是,对实例或类型调用方法的语法是不同的。但问题已经解决了。
接口不能有静态方法。实现接口的类需要将它们全部实现为实例方法。静态类不能有实例方法。QED。
也许我们的经验会有帮助。与将sqlrepository作为静态类不同,我们使用autopac进行注入,并将容器隐藏在静态类后面。然后每个实体都有一个静态存储库属性:
1 2 3 4 5 6 7 8 | public class Part : inheritence... { public static IPartRepository Repository { get { return IoCContainer.GetInstance<IRepository<Part>>(); } } // ... more part-y stuff } |
通过这种方式,我们可以交换实现,调用方始终知道从何处获取它:
1 | Part p = Part.Repository.Get(id); |
在另一个项目中,有一个partrepository在容器中注册:
1 2 3 4 | public class PartRepository : IPartRepository { // IPartRepository implementation that talks to injected DAL } |
在另一个项目中,我们有用于测试的模拟,包括预加载已知实体的存储库:
1 2 3 4 | public class MockPartRepository : Dictionary<Part, int>, IPartRepository { // IPartRepository implementation based on dictionary } |
…并在容器中注册进行单元测试。相同的调用获取存储库:
1 | Part p = Part.Repository.Get(id); |
根据定义,接口为要实现的实例创建契约。由于不能实例化静态类,静态类不能实现接口。
不需要静态存储库。只需使其非静态,并在需要时实例化它。