C# 中的默认接口方法

2025年03月24日 | 阅读 5 分钟

在本文中,我们将讨论 C# 中的默认接口方法及其示例。默认接口方法(或虚拟扩展方法)是 C# 8 的一项新功能提案,它将使 C# 开发人员能够使用 Traits 编程技术。Traits 是一种面向对象编程技术,它促进类方法的重用,并将其应用到其他不相关的类中。默认方法的主要好处是,现在可以在不破坏实现它的现有类的情况下,向现有接口添加新的默认方法。因此,此特性使程序员可以选择是否重写该方法。

什么是默认接口方法?

在 C# 8.0 中,接口仅声明成员(方法、属性、事件和索引器),而在 C# 8.0 之后,可以在接口内提供其成员及其实现。

现在,我们可以在接口内添加一个带有实现的成员方法,该方法不会破坏接口的现有实现;这种方法称为接口的默认方法或虚拟扩展方法。这是默认接口方法的主要优点,因为它提供了一种向我们库的接口添加新功能的方法,而不会影响为这些接口早期版本编写的现有代码的向后兼容性。

在 C# 接口中允许

  • 对象中的体、索引器、属性或事件访问器。
  • 安全、私有、保护、内部、公共、虚拟、抽象、密封、静态、外部静态字段。
  • 静态方法、属性、索引器和事件。
  • 添加了显式公共访问权限,以实现默认访问。

在 C# 接口中不允许

  • 实例状态、实例字段和实例自动属性。
  • 关键字 override 今天不允许,但 C# 9 发布时可能会改变。

示例 1

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

文件名:SampleInterface.cs

输出

The Initial Method
The Default Method

说明

  • 在此程序中,有一个名为I_interface的接口,它声明了两个方法:default_method_1default_method_2。default_method_2 是一个继承的方法,因此它提供了默认实现。Sample_Class 类派生自 I_interface。它充当了 default_method_1 方法的实现,这是接口要求的。
  • 在 main 方法中,创建了一个 Sample_Class 对象。在该对象上调用 default_method_1 方法。之后,创建了一个接口 I_interface 的实例并将 Sample_Class 对象分配给它。最后,在接口对象上使用 default_method_2 方法。
  • 调用了在 Sample_Class 中实现的 default_method_1 方法,结果打印出“The initial Method”。
  • default_method_2 方法是接口对象的输出。但是,它打印“The Default Method”。

示例 2

让我们用另一个例子来说明如何在 C# 中重写默认接口方法

输出

The method of the I_interface
The overridden default method
The overridden default method

说明

  • 在此示例中,Sample_Class类继承了 I_interface 和 A1_interface 的功能。实现 A1_enable 中描述的 default_method_1 方法会覆盖 default_method_2,因此类必须使用接口名称来“实现”继承的接口名称。
  • 在 Main 方法中,创建了一个 Sample_Class 实例,并将默认消息作为参数传递给 default_method_1 方法。之后,创建了一个“I_interface”对象并将其分配给 Sample_Class 对象。I_interface 对象调用 default_method_2 方法并打印“overridden default method”。
  • 最后,创建了一个 A1_interface 实例并将 Sample_Class 对象的值分配给它。在 A1_interface 对象上调用 default_method_2 方法,它也打印“The inherited default method”。

示例 3

让我们用另一个例子来说明如何将参数传递给 C# 中的默认接口方法。

文件名:DefaultMethodParameters.cs

输出

The method of the I_interface
The sum is: 55

说明

  • 在此程序中,有一个名为I_interface的接口,它声明了两个方法:default_method_1 和 default_method_1 (params:)。从代码中可以看到,default_method_1 方法是用于将两个值相加并打印结果的方法。
  • Sample_Class 类提供了 I_interface 的实现。为了接口的需要,它实现了 default_method_1。
  • 在 Main 方法中,创建了一个 Sample_Class 对象。因此,可以调用该对象上的 default_method_1 方法。最后,设置了一个接口 I_interface 的实例并将其绑定到 Sample_Class 对象。最后,在接口对象上调用带有参数的 default_method_1 方法,传递值 12 和 43,并打印“The sum is: 55”。

结论

总之,C# 中的默认接口方法提供了一种功能性的方式来升级接口而不中断现有实现。它们允许我们将方法实现直接放在接口内部。此功能支持代码重用和与旧版本的兼容性。默认(F)接口方法可以包含方法体,包括访问修饰符、静态修饰符和默认参数等修饰符。但是,它们不能包含实例状态、实例字段或实例自动属性。