抽象类看起来很像接口,但是对于OOP的初学者来说,这个概念有点令人困惑。从概念上讲,抽象类看起来当然就像一个接口,没有任何实现,但是它们之间有相当大的不同。虽然可以部分或完全实现抽象类,但必须完全实现接口。两者之间最显着的区别是抽象类可以具有默认实现,而接口只是方法的定义,仅包含成员声明。
什么是抽象类?
抽象类是一种特殊类型的类,它充当其他类的基础,无法实例化。抽象类的实现逻辑由其派生类提供。为了使类抽象,使用“抽象”修饰符,这意味着需要在从其派生的类中实现一些缺少的实现。它包含抽象成员和非抽象成员。抽象类旨在提供可被多个派生类进一步共享和覆盖的基本功能。避免任何类型的代码重复都是很有用的。它们看起来非常像界面,但具有附加功能。
什么是接口?
接口不是仅包含功能签名的类。这是一种没有实施的模式。从概念上讲,这只是方法的定义,只包含成员的声明。这是一个空外壳,其中不包含其成员的实现。它就像一个抽象基类,仅包含方法,事件,索引器,属性等抽象成员。它不能直接实例化,并且其成员可以由任何类实现。此外,一个类可以实现多个接口,但是一个类只能继承一个类。
抽象类与接口: C# 中抽象类与接口的区别
- 多重继承 – 一个类只能使用一个抽象类,因此不支持多重继承。另一方面,接口可以支持多重继承,这意味着一个类可以继承任意数量的继承。
- C#中抽象类和接口的定义 - 抽象类是一种特殊类型的类,其中可能包含没有实现的定义。实现逻辑由其派生类提供。它可以具有抽象方法以及非抽象方法。另一方面,接口只是无法执行任何操作的模式。从技术上讲,它只是一个空壳。
- 实现 – 抽象类可以包含定义及其实现。这是一个不完整的类,无法实例化。接口只能具有方法签名,而无需任何代码。
- 访问修饰符 – 抽象类可以具有多个访问修饰符,例如子,函数,属性等,而接口不允许具有访问修饰符,并且所有方法都必须隐式定义为
public
。 - 同质性 – 抽象类用于具有相同类型,行为和状态的实现,而接口则用于仅共享方法签名的实现。
- 声明 – 抽象类充当所有其他类的基类,因此它可以在不允许接口声明任何变量的情况下声明或使用任何变量。
- 构造函数声明 – 虽然抽象类可以具有构造函数声明,但接口不能具有构造函数声明。
- 核心与外围设备 – 抽象类用于定义类的核心标识,并且可用于相同数据类型的对象。另一方面,接口用于定义类的外围功能。
- 刚性与柔性 – 从功能上讲,抽象类更柔和,至少从开发人员的角度来看,而接口则更严格。
抽象类 | 接口 |
---|---|
抽象类可以具有用于函数,子元素和属性的成员声明的所有访问修饰符。 | 不允许接口具有用于函数,子函数,属性等成员声明的访问修饰符。所有成员均假定为隐式公共。 |
一个类最多只能使用一个抽象类。 | 一个类可以继承任何数量的接口。 |
抽象类不支持多重继承。 | 接口可以支持多重继承。 |
从技术上讲,它是一个类,可能包含也可能不包含定义及其实现。 | 接口只能具有功能签名,因此基本上是一个空外壳。 |
抽象类可以包含成员。 const,定义的方法和方法存根。 | 接口只能包含方法和常量。 |
它定义了类的核心标识,并用于描述相同数据类型的对象。 | 它用来描述一个班级的外围能力。 |
除非它是完整成员,否则抽象类的成员不能是静态的。 | 接口成员不能为静态。 |
非常适合用于相同类型和常见行为的实施。 | 如果多个实现仅共享方法签名,则最好使用接口。 |
它可以具有构造函数声明。 | 它不能具有构造函数声明。 |
抽象类具有预定义的字段和约束。 | 不能在接口中定义字段。 |
它可以同时具有抽象方法和非抽象方法。 | 它只能具有抽象方法。 |
总结
抽象类和接口有什么区别? 这可能是任何技术面试中最常见的问题之一。 您可能会在任何 C# 教程中找到大量有关抽象类和接口的信息,但是,了解两者之间的区别是很困难的部分。 您可以合并所有可以找到但仍然无法获得足够信息的信息。 从概念上讲,这两个都是编程中最重要的术语,并且是完全相同的,但是,它们在功能方面有很大不同。 虽然抽象类是一种特殊类型的类,它充当其他类的基础,但另一方面,接口只是一个空壳,只有成员声明。
欢迎任何形式的转载,但请务必注明出处,尊重他人劳动成果。
转载请注明:文章转载自 有区别网 [http://www.vsdiffer.com]
本文标题:C#抽象类和接口
本文链接:https://www.vsdiffer.com/vs/abstract-class-vs-interface-in-csharp.html
免责声明:以上内容仅是站长个人看法、理解、学习笔记、总结和研究收藏。不保证其正确性,因使用而带来的风险与本站无关!如本网站内容冒犯了您的权益,请联系站长,邮箱: ,我们核实并会尽快处理。