为什么我们重新实现对类派生接口的父接口它们实现派生的接口

问题描述:

我正在学习有关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. 或者这是完全不必要的/多余的?

注:我曾尝试这个代码,而无需重新实现再IDisposable接口和尝试铸造前进和后退;一切工作,因为它与重新实施工作。

+0

它会解决'IStudentRepository'在将来会丢弃'IDisposable',但这是有点冒险的。 – chris

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

+0

@mkArtak我认为唯一的原因是代码可读性。假设有人正在查看StudentRepository,他可以通过查看类是一次性的而不是通过接口定义来查明这一事实。 – Zeeshan

这是没有必要的事:

class StudentRepository: IStudentRepository, IDisposable { } 

只要写:

class StudentRepository: IStudentRepository { } 

如果你认为这在ReSharper的它会告诉你一遍,说明IDisposable是多余的。

enter image description here

+0

@ThomasLevesque猜你从未做过任何UML – MickyD

+0

很少。无论如何,.NET中使用的术语(以及Java和许多OO语言)都是“实现”。请参阅https://msdn.microsoft.com/en-us/library/ms173156.aspx:“一个接口包含一组相关功能的定义,类或结构可以**实现**。” –

+0

@ThomasLevesque UML中的术语是** ** **,它适用于任何语言 – MickyD

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

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

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

+0

第一个原因是错误的。对于反思来说,这完全没有区别。 –

+1

我不同意。如果你有一个算法检查一个对象的继承类型,然后走这些找到他们的父母等等,目的是搜索一个特定的父类型,你会发现这个类型越快它越接近继承树到入口对象。 – KeithS

+0

好的,也许我误解了你在说什么。你能举个例子吗?因为据我所知,编译器生成完全相同的类型,有或没有'IDisposable'的重复(至少我还没有找到任何区别) –

有一个我能想到的理由,那里有道理。

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