C# 接口

2025 年 9 月 8 日 | 阅读 7 分钟

在 C# 编程语言中,接口是类或结构的蓝图。接口关键字用于定义接口。它类似于抽象类,因为接口中声明的所有方法都是抽象方法。它包含多个方法组、属性、事件和索引器。

接口不能有方法体,也不能直接实例化。它们用于实现抽象和多重继承,这些是类无法实现的。它的实现必须由类或结构提供。实现接口的类或结构应提供接口中声明的所有方法的实现。

接口(从 C# 8.0 版本开始)还可以包括默认实现和静态成员,这在设计中提供了更大的灵活性。

接口的语法

它具有以下语法:

在这个语法中,

  • interface InterfaceName: 它表示接口的名称。
  • void MethodName(): 它表示没有实现的方法名称。
  • PropertyName: 它表示具有 get 和 set 访问器的属性名称。
  • EventHandler, EventName: 它用于在接口内部声明事件。

C# 接口示例

让我们举一个例子来说明 C# 中的接口。

示例

编译并运行

输出

drawing rectangle...
drawing circle...

说明

在此示例中,我们创建了一个 Drawable 接口,它定义了一个带 draw() 方法的契约。之后,我们创建了 Rectangle 和 Circle 类,它们通过提供自己的 draw() 方法版本来实现此接口。在 main() 函数中,使用 Drawable 类型的引用在两个对象上调用 draw() 方法,这演示了多态性,其中相同类型的接口调用不同的实现。

注意:接口方法默认是 public 和 abstract 的。不能显式地为接口方法使用 public 和 abstract 关键字。

例如

默认接口方法

在 C# 8.0 及更高版本中,默认接口方法使我们能够直接在接口中提供方法实现。它有助于在接口中包含新成员,而不会破坏实现它们的现有类和结构。

C# 默认接口方法示例

让我们举一个例子来说明 C# 中的默认接口方法。

示例

输出

LOG: Application started
INFO: Running smoothly

说明

在此示例中,我们声明了一个 Logger 接口,其中包含一个抽象方法 Log 和一个打印信息消息的默认方法 LogInfo。之后,我们创建了一个 ConsoleLogger 类,它实现了 Log() 方法,而 LogInfo() 使用接口提供的默认实现。在 main() 函数中,当通过 Logger 引用调用 ConsoleLogger 对象时,两个方法都会执行。

接口继承

在 C# 中,接口继承是一种接口,它可以从单个或多个接口继承,将它们的契约合并到一个接口中。实现子接口的类必须实现所有继承接口的所有成员。

C# 接口继承示例

让我们举一个例子来说明 C# 中的接口继承。

示例

编译并运行

输出

Car has started.
Car is moving.
Car has stopped.

说明

在此示例中,我们演示了接口继承,其中 Vehicle 类继承自 Movable 和 Stoppable。之后,Car 类实现了所有必要的方法。在 main() 函数中,Vehicle 引用调用 Start、Move 和 Stop,这说明了多重接口实现和多态性。

C# 中的显式接口实现

在 C# 编程语言中,显式接口实现是一种技术,用于当一个类实现两个或多个包含同名方法的接口时。在这种情况下,类应显式实现接口以解决歧义。

C# 显式接口示例

让我们举一个例子来说明 C# 编程中的显式接口。

示例

编译并运行

输出

Employee Details: Name- Michael, ID- 101
Project Details: Project- C# Interfaces, Status- Completed

说明

在此示例中,我们创建了两个 Employee 和 Project 接口,它们定义了相同的 ShowDetails() 方法。在 Employee1 类中,每个接口方法都显式实现,并且只能通过它们各自的接口引用访问,这避免了歧义。

何时以及为何在 C# 中使用接口?

C# 中的接口是一个重要的特性,它声明了类必须遵守的契约或规范。我们可以在以下情况下使用接口

  • 定义通用契约: 我们可以定义一个接口来建立该契约,以确保几个类共享一组共同的方法、属性、事件或索引器。
  • 应用多重继承: C# 不允许类进行多重继承,但允许多重接口实现。如果我们需要一个类从多个源继承行为或结构,我们可以应用接口来实现多重继承。它还使我们能够轻松地在不同类之间重用代码。
  • 强制特定形式: 如果我们需要为应用程序或库中的类执行特定形式或一组特定的方法和属性,可以使用接口来确保类遵循该形式。
  • 应用多态性: 接口是 C# 中实现多态性的重要特性。当有多个类实现同一接口时,我们可以相同地处理这些类的对象,并且以多态方式处理不同的对象更简单。

接口的关键特性

C# 中接口有几个特性。其中一些如下:

1) 契约定义

接口用于定义一个契约,实现类应通过为其所有声明的成员提供实现来履行该契约。

2) 多态性

在 C# 编程中,接口允许运行时多态性。它允许不同的类保留为相同类型接口的实例。

3) 多重继承

C# 编程语言支持多重接口继承,这使得类能够实现多重继承。

4) 访问修饰符

默认情况下,接口的所有成员都是公共和抽象的;不允许私有成员。

5) 无字段

在 C# 中,接口不能包含实例字段、构造函数或析构函数。接口只声明成员的签名。

6) 抽象

接口有助于在 C# 中实现完全抽象。接口通过仅定义类应该做什么,而不是如何做来隐藏实现细节。

结论

总而言之,C# 接口提供了一种定义类必须遵循的契约的方式。接口支持抽象、多重继承和多态性,从而提高了代码的灵活性、可重用性和可维护性。借助 C# 8.0 及更高版本,接口还可以包含默认方法,这使得它们在创建可伸缩和模块化应用程序方面更加强大。

C# 接口常见问题解答

1) C# 中的接口是什么?

在 C# 中,接口是一个契约,它指定一组没有实现的成员(方法、属性、事件、索引器)。实现接口的类或结构应提供实现。

2) C# 中的接口可以有构造函数吗?

不能,接口不能有构造函数,因为它们不能被实例化。它们旨在由类或结构实现。

3) 接口可以从另一个接口继承吗?

可以,接口可以从一个或多个接口继承。它提供了将多个契约合并到一个接口中的能力。

4) 抽象类与 C# 中的接口有什么区别?

抽象类和接口之间的主要区别如下:

  • 抽象类: 它包含字段、构造函数和混合实现。
  • 接口: 它不能包含字段或构造函数,只有声明。

5) C# 中的显式接口实现是什么?

显式接口实现是一种声明接口方法的方式,使得它们只能通过接口实例访问,而不能直接从类中访问。当一个类实现多个具有相同方法名的接口时,它用于消除方法名冲突。


下一主题C-sharp-抽象