什么是 C# 中的接口(附示例)

⚡ 智能摘要

C# 中的接口定义了一个连接trac它指定类必须实现哪些方法和属性,但不提供实际代码。实现类提供具体的行为,从而实现松耦合和跨不相关类型的多重继承。

  • 🔗 连接器tract: 接口声明了每个实现类必须定义的方法和属性签名。
  • 未实施: 接口只包含声明,实际的方法代码由类编写。
  • ???? 关键词: interface关键字用于创建类型,类使用冒号来实现它。
  • 🔀 多种接口: 一个类可以实现多个接口,这使得 C# 具有多重继承的特性。
  • 界面与ABStract 类: 接口仅定义行为,而绝对值tract 类还可以保存共享状态和代码。
  • 🤖 人工智能辅助: GitHub Copilot 构建接口和实现,而 ML.NET 管道则依赖于基于接口的转换器。tracTS。

C# 接口

C#中的接口是什么?

An 接口 在 C# 中,它与类一起使用来定义一个连接。trac接口是一份关于类将向应用程序提供哪些功能的协议。接口定义了类可以执行哪些操作。接口声明了属性和方法。至于方法具体做什么,则由类自己定义。

让我们通过更改控制台应用程序中的类来查看接口的示例。请注意,我们不会运行代码,因为没有任何东西可以使用接口运行。

C# 接口示例

让我们创建一个接口类。该类将被命名为“Guru99Interface。”我们的主类将继承这个定义的接口。所有代码都需要写在 Program.cs 文件中。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DemoApplication
{
 interface IGuru99Interface
 {
  void SetTutorial(int pID, string pName);
  String GetTutorial();
 }

 class Guru99Tutorial : IGuru99Interface
 {
  protected int TutorialID;
  protected string TutorialName;

  public void SetTutorial(int pID, string pName)
  {
   TutorialID = pID;
   TutorialName = pName;
  }

  public String GetTutorial()
  {
   return TutorialName;
  }

  static void Main(string[] args)
  {
   Guru99Tutorial pTutor = new Guru99Tutorial();

   pTutor.SetTutorial(1,".Net by Guru99");

   Console.WriteLine(pTutor.GetTutorial());

   Console.ReadKey();
  }
 }
}

Code 解释:-

在这里,我们解释代码的重要部分

C# 接口示例

  1. 我们首先定义一个名为“Guru99接口。”请注意,关键字“接口”用于定义接口。
  2. 接下来,我们定义接口将使用的方法。在本例中,我们定义的方法与前面所有示例中使用的方法相同。请注意,接口只声明方法。它不定义其中的代码。
  3. 然后我们做出我们的 Guru99Tutorial 类继承了该接口。在这里,我们编写代码来定义接口中声明的各种方法。这种编码方式实现了以下目标:
    • 它确保了该类, Guru99Tutorial 只添加了“SetTutorial”和“GetTutorial”方法所需的代码,除此之外没有其他内容。
    • 它还确保界面表现得像一个控制台一样。trac吨。 这 必须遵守该规定tract。所以如果 contrac它说应该有两个方法,分别叫做“SetTutorial”和“GetTutorial”,那就应该这样。

C# 接口与绝对值tract 类

初学者常问的一个问题是,C# 接口与……有何不同? ABStracT级两者都定义了一个contrac其他类型也遵循这些类型,但它们服务于不同的设计目标。

主要区别如下:

  • 实施: 接口仅包含声明,而绝对值则包含定义。tract 类可以提供两种 abstract 个成员和完全实现的方法。
  • 多重继承: 一个类可以实现多个接口,但只能继承一个绝对值。tract 类。
  • 省(自治区,直辖市,州): 腹肌trac类可以包含字段、构造函数和带有数据的属性,而接口不能存储实例状态。
  • 访问修饰符: ABStract 类成员可以是公共的、受保护的或私有的,而经典接口成员则隐式为公共的。
  • 用例: 使用接口为不相关的类型添加功能,以及一个绝对值tract 类用于在密切相关的类型之间共享通用代码。

简而言之,接口描述了类可以做什么,而绝对值则描述了类可以做什么。tract 类还可以定义部分实现方式。

如何在 C# 中实现多个接口

与类继承不同,C# 允许单个类实现多个接口。这使得该语言能够提供一种安全的多重继承形式,避免同时继承多个基类所带来的歧义。

要实现多个接口,请在类名后列出它们,并用逗号分隔。然后,该类必须定义它所实现的每个接口中声明的所有方法。

步骤1) 声明两个接口,每个接口都有自己的方法。

步骤2) 创建一个类,实现这两个接口,接口名称之间用逗号分隔。

步骤3) 为每个接口中声明的每个成员提供一个方法体。

下面的示例展示了一个实现了 I 接口的 Document 类。Readable 以及一个 IWritable 接口。

using System;
namespace DemoApplication
{
 interface IReadable
 {
  void Read();
 }
 interface IWritable
 {
  void Write();
 }
 class Document : IReadable, IWritable
 {
  public void Read()
  {
   Console.WriteLine("Reading the document");
  }
  public void Write()
  {
   Console.WriteLine("Writing to the document");
  }
  static void Main(string[] args)
  {
   Document doc = new Document();
   doc.Read();
   doc.Write();
   Console.ReadKey();
  }
 }
}

Code 解释:-

  1. 我们声明了两个接口,IReadable 以及 IWritable 接口。每个接口都声明一个没有方法体的方法。
  2. Document 类在冒号后列出了两个接口,并用逗号分隔,因此它同意同时遵循这两个接口。tracTS。
  3. 然后,该类定义了读取和写入方法。跳过ping 两种方法都会导致编译时错误。
  4. Main 方法创建了一个 Document 对象并调用了这两个方法,证明该类满足这两个接口。

程序运行时,它会打印以下内容: 阅读文件 第一行和 写入文档 在第二行。这种模式保持每个连接trac它小巧而专注,这使得 Document 类更容易测试和扩展。

在 C# 中使用接口的优势

接口在专业的 C# 项目中被广泛使用,因为它们使代码更灵活、更易于维护。它们允许你面向特定需求进行编程。trac而不是具体类别。

主要优点包括:

  • 松耦合: Code 这取决于接口,而不是特定的类,因此实现方式的改变不会影响调用者。
  • 多重继承: 一个类可以从多个接口继承行为,而普通的类继承则不允许这样做。
  • 可测试性: 接口使得在单元测试期间用模拟对象替换真实类变得简单。
  • 依赖注入: 框架在运行时注入接口实现,这是 SOLID 原则的核心思想。
  • 坚持是关键 每个实现类都必须提供相同的成员集,从而保持 API 的可预测性。

由于这些优势,接口成为大多数现代 C# 设计模式和应用程序框架的核心。

常见问题

按照惯例,C# 接口名称以大写字母 I 开头,例如 IDisposable 或 IReadable前缀 I 直接表明该类型是接口而不是类或结构体。

在 C# 8.0 之前,接口仅包含声明。从 C# 8.0 开始,默认接口方法允许接口提供方法体,因此当添加新成员时,旧的实现仍然可以继续工作。

显式实现使用接口前缀命名成员,例如 IReadable读取。然后,该成员只能通过接口引用来调用,这样就避免了两个接口声明相同方法时出现名称冲突。

是的。一个接口可以继承一个或多个其他接口。实现了子接口的类必须定义子接口及其所有继承的父接口中的所有方法。

不,接口不能直接实例化,因为它没有实现。你需要创建一个实现了该接口的类的对象,然后通过接口类型引用该对象。

是的。经典接口的成员默认是公共的,不能添加访问修饰符。实现类也必须将匹配的成员声明为公共的。

是的。GitHub Copilot 可以根据简短的注释或接口名称生成接口脚手架、建议方法签名并生成实现该接口的类,从而加快配置速度。tract-first 开发。

ML.NET 依赖于 ITransformer 和 IDataView 等接口来定义其机器学习管道。针对这些接口进行编码……tracts 允许您在不重写周围训练代码的情况下交换模型和数据源。

总结一下这篇文章: