为什么我们在实现派生接口

时间:2017-03-16 14:51:34

标签: c# interface

我正在研究Microsoft Docs上的UOW模式并看到以下代码

interface IStudentRepository: IDisposable
{
    void SomeMethod();
}
// Interface Implementaion

class StudentRepository: IStudentRepository, IDisposable
{
   public void SomeMethod(){}
   public void Dispose(){}
}

现在我的问题是为什么我们在实现派生接口的类上重新实现派生接口的父接口?例如,IStudentRepository接口派生自IDisposable接口,但是当我们在StudentRepository类上实现IStudentRepository接口时,除了IStudentRepository接口之外,我们还实现了IDisposable。

  1. 它会带来什么好处?
  2. 哪个问题解决了?
  3. 或者完全没必要/多余?
  4. 注意:我已经尝试过这段代码而没有重新实现IDisposable并且尝试了后退和前进;一切正常,因为它与重新实施一起工作。

4 个答案:

答案 0 :(得分:3)

没有必要这样做:

class StudentRepository: IStudentRepository, IDisposable { }

只需写下:

class StudentRepository: IStudentRepository { }

如果您在 Resharper 中查看此内容,它会告诉您再次声明IDisposable是多余的。

enter image description here

答案 1 :(得分:3)

在实现IDisposable的类上指定IStudentRepository是多余的。它完全没有效果。

答案 2 :(得分:1)

我可以想到这可能是一个好主意的几个原因:

  • 某些继承检查算法(尤其是基于反射的算法)将无法在某些场景中发现继承类型,例如父接口。这可能是一个错误或预期的行为(继承链可能很长,损害图形行者或其他反射类型检查算法的性能)。在这些情况下,如果您需要确定该方法会快速找出该对象是IDisposable,那么重新实现。
  • 可能会重构父接口以删除Disposable实现,但子类仍将需要它。克里斯在评论中说,这不是一个很好的理由;一旦一个对象实现了IDisposable,从父类中删除它就会很成问题,但是将实现保留在子类中。
  • 它提醒开发人员仔细阅读源代码,该对象是IDisposable。一目了然IStudentRepositories是IDisposable并不明显,但如果这是首选用法的核心(即存储库应该是using块的焦点),那么每条信息都会有所帮助。

正如你所发现的那样,虽然没有必要;如果从StudentRepository中删除IDisposable,由于IStudentRepository上的继承,该类仍然是IDisposable。

答案 3 :(得分:0)

我可以想到一个原因,那就是有意义的。

接口的客户端(StudentRepository)有一次性成员,它也想处理它。它重新实现了IDisposable接口,以防止IStudentRepository接口上未来的重大变化。换句话说,将来IStudentRepository可能不是IDisposable,客户端不需要进行任何更改。