在C#中显示继承接口实现的最佳方法是什么?

And*_*are 3 c# interface

给定以下接口:

interface IFoo
{
    void Foo();
}

interface IBar : IFoo
{
    void Bar();
}
Run Code Online (Sandbox Code Playgroud)

表示给定类实现的最佳方法是什么IBar

方法A:

class Implementation : IBar { ... }
Run Code Online (Sandbox Code Playgroud)

这看起来更简单,更清晰,但并不表示Implementation实现IFoo.

方法B:

class Implementation : IBar, IFoo { ... }
Run Code Online (Sandbox Code Playgroud)

这似乎是最丰富的信息,但真正需要的额外信息?

tva*_*son 6

编译器不需要额外的信息,但它可能对您的代码的读者有所帮助,因为读者不必知道IBar扩展IFoo.此框架中的一个例子是List<T>一个实现<IList<T>,ICollection<T>以及IEnumerable<T>,即使IList<T>; 延伸ICollection<T>IEnumerable<T>.

编辑:我认为,至少对我来说,我列出这两者的主要原因是你通常不会想到接口彼此继承.从类派生时,您希望继承本身可以继承的行为.如果您感兴趣,可以按照类层次结构进行推导.使用接口时,接口的派生更加不寻常,因此您不太可能看起来并且更有可能错过连接.列出它们都可以解决这个问题而不会有太多痛苦.


Gre*_*ech 6

就个人而言,我会选择前者.对于后者,假设你在这种情况下你有一堆派生类:

class DerivedA : Implementation, IBar, IFoo { ... }
class DerivedB : Implementation, IBar, IFoo { ... }
class DerivedC : Implementation, IBar, IFoo { ... }
class DerivedD : Implementation, IBar, IFoo { ... }
Run Code Online (Sandbox Code Playgroud)

然后你的Implementation变更要求,以便它现在需要实现另一个接口,例如IBaz(只要它提供非抽象的实现,它可以做而不必影响任何派生类),那么你有两个选择:

  1. 保留所有派生类定义,而不显式声明新接口信息,在这种情况下,类定义现在根据标准不正确,如果人们希望始终遵循标准,则可能会产生误导.

  2. 去查找所有派生类及其所有派生类,并修复它们的声明.这需要时间,有点容易出错并且难以完全完成,并且将您的单个文件更改为多文件签入.

这些选项都没有吸引力,所以我选择不会让你陷入困境的选项.只需声明派生最多的接口.