假设我们有一个带有很少方法声明的接口,并且类似的方法(在接口中声明)被声明为抽象类中的抽象方法。两者都将起到相同的作用,例如继承和强制实现基类中的所有方法。那么它们与 C# 之间的主要区别是什么。面试中经常被问到。
4 回答
具有所有抽象方法和接口的抽象类有两个主要区别。
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 -
不同的语言有不同的区别。
在 Java 中,您可以从一个抽象类派生一个类,但/和从许多接口派生。在 Java 8 中,接口也可以有默认方法,它们与抽象类之间的区别几乎是唯一的。
在 SmallTalk 中根本没有使用接口,因为所有类都可以作为接口工作。
在 C++ 中,区别并不明显,您可以随意使用抽象类或接口。接口有一个抽象类的例子。
不要忘记接口的出现是因为有两个父类的技术问题。你在谈论理论。在抽象理论中,除了类之外不需要接口,您的问题就失去了意义。在真正的 OOP 语言中与 SmallTalk 相同。
好吧,据我所知,在 C# 中,所有方法都是抽象的抽象类和接口之间没有太大区别。从这些(抽象类或接口)继承的任何类都必须实现声明的方法。
但是如果从一个接口继承,你可以有多个接口,但对于抽象类,你只能有一个。
因此,与其让抽象类只有抽象方法,不如将其声明为接口。
但是如果你想限制接口之间的继承,将它们都声明为只有抽象方法的抽象类,这样消费者就只能从它们中的任何一个继承。
我认为这个问题与 JAVA 或 C# 有关。在 C++ 中,抽象类也称为接口。但是让我们坚持接口和抽象类之间的区别(比如说在 JAVA 中):
- 接口和抽象类都提供了一系列方法和属性,这些属性必须在使用之前进行扩展。
- 仅通过接口支持多重继承:您可以扩展多个接口但只能从一个类继承(也适用于抽象类)
- 抽象类可以提供某些方法的实现和其他方法的抽象,而接口仅提供必须在扩展它们的类中实现的抽象。
哪一个更好?这取决于您的应用程序。例如,一些设计模式与接口配合得很好,而另一些则更适合抽象类