关于OOP:C#中抽象类和接口的区别

Difference between abstract Class and Interface in C#

本问题已经有最佳答案,请猛点这里访问。

这篇文章说代码项目抽象类-可以有方法声明和方法定义。

但这篇文章说程序调用抽象-只能有方法声明。

我很困惑。有人能告诉我两者的确切区别是什么吗?


请参阅本文:

Multiple inheritance

一个类可以继承几个接口。

一个类只能继承一个抽象类。

Default implementation

接口不能提供任何代码,只能提供签名。

抽象类可以提供完整的默认代码和/或仅提供必须重写的详细信息。

Access Modfiers

接口不能具有子、函数、属性等的访问修饰符。一切都假定为公共的。抽象类可以包含子、函数、属性的访问修饰符。核心与外围

接口用于定义类的外围能力。换句话说,人和车辆都可以从一个可移动的接口继承。

抽象类定义了类的核心标识,并在那里用于相同类型的对象。

Homogeneity

如果各种实现只共享方法签名,那么最好使用接口。

如果各种实现类型相同,并且使用公共行为或状态,那么抽象类更适合使用。

Adding functionality (Versioning)

如果我们向接口添加一个新方法,那么我们必须跟踪接口的所有实现,并为新方法定义实现。

如果我们向抽象类添加一个新方法,那么我们可以选择提供默认实现,因此所有现有的代码都可以正常工作。

字段和常量在接口中不能定义任何字段抽象类可以定义字段和常量


接口更像是契约——它详细说明了在实现它的对象上可以找到什么方法或属性。

抽象类是一个基对象——它可以包含方法、变量和行为——但是您不能创建它的具体实现——您必须从它继承并扩展它的行为。


据我所知,抽象类已经可以实现某些方法或变量的值,只要它不实现所有方法或变量的值(这将使它成为普通类)。接口不能这样做;它只能提供方法和变量存根。