根据Aamir的When to use an interface instead of an abstract class and vice versa?
当你派生一个Abstract类时,它之间的关系 派生类和基类是'是'关系。例如,一只狗 是动物,羊是动物,这意味着衍生类是 继承基类的一些属性。
然而,对于接口的实现,关系是" can 是&#34 ;.例如,狗可以是间谍犬。狗可以是马戏团的狗。一只狗 可以成为一只赛狗。这意味着您实现了某些方法 获得一些东西。
但是能力怎么样?喜欢,"一只狗可以吠叫#34;,#34;一只猫可以跳#34;,#34;蛇可以滑动",我将把它们放在一个抽象或界面中?
答案 0 :(得分:1)
如果你有一些常见的能力,比如移动,你可以有一个接口,让抽象类实现这些方法(如果动物是你唯一可以使用的东西,那么你不会真正获得很多东西有这个界面,我相信)。如果您具有仅适用于某些派生类的特定功能,请让它们实现该接口。
狗吠似乎只是一个派生类的能力,为什么不让它由派生类实现呢?将它放在抽象类中意味着所有动物都能够吠叫,但是如果狗是你唯一能够吠叫的动物,那么再次让狗类实施一个有吠声的界面似乎有点奇怪。
附注:接口不一定要定义为“可以”关系。
答案 1 :(得分:0)
执行某项操作的能力可能最适合接口,除非您希望在未实现该方法时提供某些默认行为。
请记住,C#不支持从多个类继承,但支持实现多个接口。这允许一些灵活性。比如这个:
interface IBreathes()
{
void Breathe();
}
interface IMoveable()
{
void Move(int x, int y);
}
class Snake : Animal, IBreathes, IMoveable
{
void Breathe()
{
...
}
void Move(int x, int y)
{
...
}
}
对于上面的例子,抽象类的使用会很好,但对于大型复杂的项目,解决单继承问题可能会非常令人沮丧。
答案 2 :(得分:0)
还有另外一件事要考虑:您的实现类可以实现任意数量的接口,但您可以直接从一个类继承,抽象或具体。 简而言之:尽可能使用接口,并在必要时抽象类。