首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何确定类与属性的关系(抽象和接口)

如何确定类与属性的关系(抽象和接口)
EN

Stack Overflow用户
提问于 2016-07-24 18:50:54
回答 3查看 68关注 0票数 0

根据When to use an interface instead of an abstract class and vice versa?中的Aamir

当派生抽象类时,派生类和基类之间的关系是“是”关系。例如,狗是动物,绵羊是动物,这意味着派生类从基类继承了一些属性。 而对于接口的实现,这种关系是“可以的”。狗可以是间谍狗。狗可以是马戏团的狗。一只狗可以是一只赛马狗。这意味着你要实现某些方法来获取某些东西。

但是能力呢?比如,“狗会叫”,“猫会跳”,“蛇会滑”,我会把它们放在什么地方,抽象的还是界面的?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-07-24 19:08:38

如果你有一些共同的能力,比如移动,你可以有一个接口,让抽象类实现这些方法(如果只有动物是你要使用的东西,那么拥有这个接口就不会有多大收获了)。如果您具有仅适用于某些派生类的特定能力,请让它们实现接口。

狗吠似乎只是一个派生类的能力,为什么不让它由那个派生类来实现呢?把它放在抽象类中意味着所有的动物都可以吠叫,但是如果狗是你唯一会吠的动物,那么让狗类实现一个有树皮的接口似乎有点奇怪。

附带注意:接口不必被定义为“可以是”关系。

票数 1
EN

Stack Overflow用户

发布于 2016-07-24 19:19:02

执行某些操作的能力可能最适合于接口,除非您希望提供一些默认行为,如果方法没有实现的话。

请记住,C#不支持从多个类继承,但支持实现多个接口。这就允许了一些灵活性。如下所示:

代码语言:javascript
复制
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)
    {
        ...
    }
}

对于上面的例子来说,使用抽象类是很好的,但是对于大型复杂的项目,解决单继承问题可能会变得非常令人沮丧。

票数 0
EN

Stack Overflow用户

发布于 2016-07-24 19:25:35

还有一件事要考虑:您的实现类可以实现任意多个接口,但是您只能直接继承一个类,抽象或具体。简而言之:可以时使用接口,必要时使用抽象类。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38555588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档