为子类实现接口的多个层次

3
在SocialAuth.Net库(以及其他一些库)中,我看到一个类实现了一个接口,另一个类继承了那个类,并再次实现了该接口,例如:
class Provider: IProvider

而且有

class LinkedInWrapper : Provider, IProvider

我发现LinkedInWrapper无需实现任何IProvider类,因为它已经在Provider类中实现了。我的问题是为什么LinkedInWrapper还要再次实现该接口?

5
在这种情况下,它只是一个标记,因此您可以在不查找Provider类的情况下查看LinkedInWrapper上的接口。这有点反模式,但并不罕见。然而,在其他情况下,您可能希望重新实现接口。Eric Lippert曾经就此撰写过一篇文章。 - Frank J
@Frank J,你知道这个反模式的名字吗? - Daniel B
抱歉,不是真的,我只是将其视为反模式,因为如果基类实现了额外的接口,那么现在您必须遍历继承自基类的所有类,并更新它们的签名,以及所有级别。这似乎不是很有效率。这也是C#函数上没有throws Exception标记的同样原因,因为上游可能会发生变化,您要么有一个不一致,要么就有很多工作要做。 - Frank J
@FrankJ:请把你的评论转成答案。 - Quality Catalyst
1
@QualityCatalyst:我意识到我的回答还不够详细,所以只是留了一个评论。不过我已经把它移动了。 - Frank J
1个回答

1
在这种情况下,它只是一个标记,所以你可以在不查找Provider类的情况下查看LinkedInWrapper上的接口。
这有点反模式但并不罕见。我认为这是一种反模式,因为如果基类稍后实现了其他接口会发生什么?
现在你必须遍历所有继承自基类的类,并更新它们的签名,对于所有级别都要这样做,否则模式就会不一致。如果该类在库中,使用该库的其他人保证最初会存在不一致,因为即使他们想遵循该模式,也无法更改其代码。
然而,在其他情况下,您可能需要重新实现接口。Eric Lippert写过一篇wrote an article about that文章。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接