18

一位面试官问我以下问题,我无法回答:

当抽象类存在时,为什么我们需要接口?

无论我们在接口中编写什么方法,我们也可以在抽象类中编写。那为什么我们需要单独的接口呢?

谁能告诉我是什么原因?

提前谢谢...

4

5 回答 5

17

有几个区别,

  • 抽象类只能有一个父类,而一个类可以实现多个接口。
  • 接口不能包含任何实现,抽象类可以(除了非抽象方法外,它们还可以有抽象方法)。

接口非常适合专注于我们可以在类上拥有的“视图”。该视图可以由实现该接口的多个类共享。

例如,DataTable实现IListSourceISerializable。因此,根据上下文,您可以将其视为一个列表源来读取其数据,也可以将其视为可以序列化实例的类。当您这样做时,您将专注于您可以拥有的实例的特定视图。

于 2013-05-29T16:04:42.577 回答
11

接口代表一个契约,而您可以在不同的(抽象)类中拥有该契约的多个实现。

public interface IExample
{
    void Do();
}

public abstract class DoFirst : IExample
{
    public void Do()
    {
        Console.WriteLine("Doing it the first way");
    }
}

public abstract class DoSecond : IExample
{
    public void Do()
    {
        Console.WriteLine("Doing it the second way");
    }
}

public class DoFirstConcrete : DoFirst, IExample
{
    public void DoSomethingElse()
    {
        Do();
        Console.WriteLine("Doing something else also with first.");
    }
}

public class DoSecondConcrete : DoSecond, IExample
{
    public void DoSomethingElse()
    {
        Do();
        Console.WriteLine("Doing something else also with second.");
    }
}
于 2013-05-29T16:05:09.827 回答
8

您的抽象类是部分实现。接口是契约,知道你的抽象类能做什么。你需要一个接口来描述它。

于 2013-05-29T16:06:59.103 回答
5

您可以实现多个接口,但只能从一个抽象类继承。

接口是一个空壳,只有方法的签名(名称/参数/返回类型)。这些方法不包含任何内容。界面什么都做不了。这只是一个模式

与接口不同,抽象类是类。使用起来更昂贵,因为从它们继承时需要进行查找。

抽象类看起来很像接口,但它们还有更多的东西:你可以为它们定义一个行为。更多的是关于一个人说“这些课程应该看起来像这样,并且他们有共同点,所以请填空!”。

从这里引用 e-satis(还有更多信息): 接口和抽象类有什么区别?

于 2013-05-29T16:07:08.933 回答
0

你不能从多个抽象类继承,但你可以实现多个接口。

于 2013-05-29T16:08:03.570 回答