根据When to use an interface instead of an abstract class and vice versa?中的Aamir
当派生抽象类时,派生类和基类之间的关系是“是”关系。例如,狗是动物,绵羊是动物,这意味着派生类从基类继承了一些属性。 而对于接口的实现,这种关系是“可以的”。狗可以是间谍狗。狗可以是马戏团的狗。一只狗可以是一只赛马狗。这意味着你要实现某些方法来获取某些东西。
但是能力呢?比如,“狗会叫”,“猫会跳”,“蛇会滑”,我会把它们放在什么地方,抽象的还是界面的?
发布于 2016-07-24 19:08:38
如果你有一些共同的能力,比如移动,你可以有一个接口,让抽象类实现这些方法(如果只有动物是你要使用的东西,那么拥有这个接口就不会有多大收获了)。如果您具有仅适用于某些派生类的特定能力,请让它们实现接口。
狗吠似乎只是一个派生类的能力,为什么不让它由那个派生类来实现呢?把它放在抽象类中意味着所有的动物都可以吠叫,但是如果狗是你唯一会吠的动物,那么让狗类实现一个有树皮的接口似乎有点奇怪。
附带注意:接口不必被定义为“可以是”关系。
发布于 2016-07-24 19:19:02
执行某些操作的能力可能最适合于接口,除非您希望提供一些默认行为,如果方法没有实现的话。
请记住,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)
{
...
}
}对于上面的例子来说,使用抽象类是很好的,但是对于大型复杂的项目,解决单继承问题可能会变得非常令人沮丧。
发布于 2016-07-24 19:25:35
还有一件事要考虑:您的实现类可以实现任意多个接口,但是您只能直接继承一个类,抽象或具体。简而言之:可以时使用接口,必要时使用抽象类。
https://stackoverflow.com/questions/38555588
复制相似问题