【问题标题】:Difference between Interface & Abstract class with only abstract methods只有抽象方法的接口和抽象类之间的区别
【发布时间】:2014-03-05 10:44:29
【问题描述】:

假设我们有一个接口,它的方法声明很少,并且类似的方法(在接口中声明)被声明为抽象类中的抽象方法。两者都将起到相同的作用,例如继承和强制实现基类中的所有方法。 那么它们与 C# 之间的主要区别是什么。面试中经常被问到。

【问题讨论】:

  • @MarounMaroun 无论如何都不是重复的,因为这里不是java问题!这是一个严格的java问题。而这个问题在 Java 和它之外有完全不同的答案。
  • 它的 w.r.t C#。我们可以通过将方法设为抽象来使抽象类与接口相同,因此继承它的人必须实现该方法,所以有什么区别。是他们一样吗?

标签: inheritance interface abstract-class abstract-methods


【解决方案1】:

具有所有抽象方法和接口的抽象类有两个主要区别。

 1. Multiple Inheritance. - Your class can inherit as more than one interface. 
 But this is not possible to inherit multiple class in c# because famous diamond problem.

 2. Interface will help you to Dependency Injection Problem. 
 You can check DI problem here -

What is dependency injection?

【讨论】:

    【解决方案2】:

    我认为这个问题与 JAVA 或 C# 有关。在 C++ 中,抽象类也称为接口。但是让我们坚持接口和抽象类之间的区别(比如说在 JAVA 中):

    1. 接口和抽象类都提供了一系列方法和属性,这些方法必须在使用之前进行扩展。
    2. 仅通过接口支持多重继承:您可以扩展多个接口,但只能从一个类继承(也适用于抽象类)
    3. 抽象类可以提供某些方法的实现和其他方法的抽象,而接口只提供必须在扩展它们的类中实现的抽象。

    哪个更好?这取决于您的应用程序。例如,一些设计模式与接口配合得很好,而另一些则更适合抽象类

    【讨论】:

      【解决方案3】:

      不同语言的区别是不同的。

      在 Java 中,您可以从一个抽象类派生一个类,但/和从许多接口派生。在 Java 8 中,接口也可以有默认方法,它们与抽象类之间的区别几乎是唯一的。

      在 SmallTalk 中根本没有使用接口,因为所有类都可以作为接口工作。

      在 C++ 中,区别并不明显,您可以随意使用抽象类或接口。接口有一个抽象类的例子。

      不要忘记接口的出现是因为有两个父类的技术问题。你在谈论理论。在抽象理论中,除了类之外不需要接口,你的问题就失去了意义。在真正的 OOP 语言中也是如此,就像 SmallTalk。

      【讨论】:

        【解决方案4】:

        好吧,据我所知,在 C# 中,所有方法都是抽象的抽象类和接口之间没有太大区别。从这些(抽象类或接口)继承的任何类都必须实现声明的方法。

        但是如果从一个接口继承,你可以有多个接口,但是对于抽象类,你只能有一个。

        因此,与其让抽象类只有抽象方法,不如将其声明为接口。

        但是如果要限制接口之间的继承,请将它们都声明为只有抽象方法的抽象类,这样消费者就只能从它们中的任何一个继承。

        【讨论】:

          猜你喜欢
          • 2023-03-03
          • 2016-11-24
          • 2012-07-19
          • 2011-04-07
          • 1970-01-01
          • 1970-01-01
          • 2012-03-18
          • 2014-01-20
          • 1970-01-01
          相关资源
          最近更新 更多