C#中的抽象类和接口

Anonim

抽象类看起来很像一个接口,但这个概念对于OOP的初学者来说有点混乱。从概念上讲,抽象类看起来就像一个接口,当然,没有任何实现,但是它们有相当大的差异。虽然抽象类可以部分或完全实现,但必须完全实现接口。嗯,两者之间最显着的区别是抽象类可以有默认实现,而接口只是包含成员声明的方法的定义。让我们详细讨论两者的理论方面。

什么是抽象类?

抽象类是一种特殊类型的类,它充当其他类的基础,无法实例化。抽象类的实现逻辑由其派生类提供。为了使类抽象,使用“抽象”修饰符,这意味着需要在从它派生的类中实现一些缺少的实现。它包含抽象和非抽象成员。抽象类旨在提供可由多个派生类进一步共享和覆盖的基本功能。避免任何类型的代码重复很有用。它们看起来非常像接口,但具有附加功能。

什么是界面?

另一方面,接口不是仅包含功能签名的类。这是一种没有实施的模式。从概念上讲,它只是仅包含成员声明的方法的定义。它是一个空壳,不包含其成员的实现。它就像一个抽象基类,只包含抽象成员,如方法,事件,索引器,属性等。它不能直接实例化,其成员可以由任何类实现。另外,一个类可以实现多个接口,但是,类只能继承一个类。

抽象类与接口:C#中抽象类和接口之间的区别

  1. 多重继承 - 类只能使用一个抽象类,因此不支持多重继承。另一方面,接口可以支持多继承,这意味着类可以继承任意数量的继承。
  2. 定义C#中的抽象类和接口 - 抽象类是一种特殊类型的类,它可能包含没有实现的定义。实现逻辑由其派生类提供。它可以有抽象方法和非抽象方法。另一方面,界面只是一种无法做任何事情的模式。从技术上讲,它只是一个空壳。
  3. 履行 - 抽象类可以包含定义及其实现。这是一个不完整的类,无法实例化。接口只能具有功能的签名而无需任何代码。
  4. 访问修饰符 - 抽象类可以有多个访问修饰符,例如subs,函数,属性等,而不允许接口具有访问修饰符,并且所有方法都必须隐式定义为public。
  5. 同质性 - 抽象类用于相同类型,行为和状态的实现,而接口用于仅共享方法签名的实现。
  6. 宣言 - 抽象类充当所有其他类的基类,因此它可以声明或使用任何变量,而不允许接口声明任何变量。
  7. 构造函数声明 - 虽然抽象类可以具有构造函数声明,但接口不能具有构造函数声明。
  8. 核心与外围 - 抽象类用于定义类的核心标识,可用于相同数据类型的对象。另一方面,接口用于定义类的外围能力。
  9. 刚性与柔软 - 抽象类在功能方面更加柔顺,至少从开发人员的角度来看,而界面更加严格。

抽象类与接口:表格形式

抽象类

接口

抽象类可以具有用于函数,子和属性的成员声明的所有访问修饰符。 不允许接口具有用于函数,子,属性等的成员声明的访问修饰符。所有成员都被假定为隐式公共。
一个类最多只能使用一个抽象类。 一个类可以继承任意数量的接口。
抽象类不支持多重继承。 接口可以支持多重继承。
从技术上讲,它是一个可能包含也可能不包含定义及其实现的类。 接口只能具有功能的签名,因此它基本上是一个空shell。
抽象类可以包含成员。 consts,定义的方法和方法存根。 接口只能包含方法和consts。
它定义了类的核心标识,用于描述相同数据类型的对象。 它用于描述类的外围能力。
除非是完整成员,否则抽象类的成员不能是静态的。 接口的成员不能是静态的。
它非常适合同类和常见行为的实现。 如果多个实现仅共享方法签名,则最好使用接口。
它可以有构造函数声明。 它不能有构造函数声明。
抽象类具有预定义的字段和约束。 无法在接口中定义字段。
它可以同时具有抽象和非抽象方法。 它只能有抽象的方法。

摘要

抽象类和接口有什么区别?这可能是任何技术访谈中提出的最常见问题之一。您可能会在任何C#教程中找到关于抽象类和接口的大量信息,但是,了解两者之间的差异是非常困难的部分。您可以整合所有可以找到但仍然无法获得的信息。好吧,从概念上讲,两者都是编程中最重要的术语,并且完全相同,但是,它们在功能方面有很大不同。虽然抽象类是一种特殊类型的类,它充当其他类的基础,但另一方面,接口只是一个只有成员声明的空壳。