【问题标题】:Why do we need interfaces when abstract classes exist? [duplicate]当抽象类存在时,为什么我们需要接口? [复制]
【发布时间】:2013-05-29 16:03:03
【问题描述】:

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

既然存在抽象类,为什么还需要接口?

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

谁能告诉我是什么原因?

提前谢谢...

【问题讨论】:

  • 多重继承突然想到,c#中可以实现多个接口但只能继承一个类
  • 从Java的角度来看,抽象类用于继承层次,接口用于实现契约。
  • 接口在依赖注入和单元测试场景中也是无价的。抽象基类仍然可以包含逻辑,因此无法在测试场景中完全模拟出来。
  • 接口是形容词,类是名词。
  • -1,没有研究工作。您不能从搜索抽象类和接口之间的差异开始吗?这不完全是一个未讨论的话题。

标签: c#


【解决方案1】:

有几个不同,

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

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

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

【讨论】:

  • 我不完全相信这个答案。该语言本可以设计为允许多重继承,并且它不会过时接口。不能从多个抽象类派生不是选择接口而不是类的理由,反之亦然。
  • @Daniel,我同意,我只是强调了最明显的差异之一
【解决方案2】:

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

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.");
    }
}

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

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

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

      从这里引用 e-satis(还有更多信息): What is the difference between an interface and abstract class?

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-04-17
          • 2013-02-15
          • 2012-03-30
          • 1970-01-01
          • 2013-06-23
          • 1970-01-01
          • 1970-01-01
          • 2012-12-20
          相关资源
          最近更新 更多