抽象类和接口之间的主要区别是什么?

时间:2010-08-27 14:37:28

标签: .net oop interface abstract-class

根据最近的采访趋势,我注意到这个问题每次都会出现。但是,当一个人回答一般定义时,面试官说每个人都知道它......说出不同的东西。进一步的情景被问到哪一个将被使用并且是有益的以及为什么

请善意分享对此主题的任何新见解。

提前致谢...

3 个答案:

答案 0 :(得分:4)

抽象类可以定义方法的基本实现以及受保护或私有的数据成员,而接口只定义类必须与公共数据成员一起提供的功能。

我喜欢看它的方式是抽象类是其他类的基础。它不仅指定特定系列事物必须具有的操作,还指定这些操作执行其工作所需的数据。特定的孩子可以添加(甚至忽略,如果需要)特定的数据元素。另一方面,界面是一种契约 - 它没有说明你将如何做某事,只说明你必须做的事情以及你将使外界看到的事物。您的内部工作是您在界面中的业务。

答案 1 :(得分:4)

抽象类可以为它们的方法提供实现,而接口严格提供契约(对象必须实现的方法)。

抽象类在您希望为继承者提供基本实现但您不希望直接创建类的实例的情况下非常有用。例如,想想一辆车。您不希望创建通用汽车,但每个护理可以共享一些基本功能集:

public abstract class Car
{
    public InternalCombustionEngine Engine { get; private set; }

    public virtual void Start()
    {
        Engine.Start();
    }

    public abstract void Drive();
}

如果某些类可能彼此不直接相关,但您希望以相同的方式对待,因为每个类都具有类似的功能集,那么接口非常有用。

答案 2 :(得分:1)

除了其他人所说的内容之外,我还将界面视为一种行为关系,这种关系在各个阶段都很常见,但不属于is-a关系。它是一种表达共同行为的方式,而不是is-a关系的继承。我相信这就是为什么有些人调用接口是穷人的多重继承。