在C#编程中,接口是一种定义契约的类型,它规定了实现该接口的类必须提供哪些成员,本身不包含具体的实现逻辑,是面向对象编程中实现多态和解耦的重要工具。

C#接口的基础语法
定义C#接口需要使用interface关键字,接口名称通常以大写字母I开头,遵循帕斯卡命名法,接口中可以包含方法、属性、索引器、事件的声明,但不能包含字段、构造函数,也不能给成员设置访问修饰符,默认都是公开的。
下面是一个最简单的接口定义示例:
// 定义用户操作接口
public interface IUserOperation
{
// 声明获取用户名称的方法,无实现体
string GetUserName();
// 声明用户年龄属性,只有get访问器声明
int Age { get; }
}
接口的实现方式
类或者结构体要实现接口,需要在类定义后面加上冒号跟上接口名称,然后为接口中声明的所有成员提供具体的实现,实现的方法需要标记为public,且方法签名要和接口中声明的一致。
以下是实现上面IUserOperation接口的示例:
// 普通用户类实现IUserOperation接口
public class NormalUser : IUserOperation
{
public string GetUserName()
{
return "普通用户";
}
public int Age
{
get { return 20; }
}
}
// 管理员类实现IUserOperation接口
public class AdminUser : IUserOperation
{
public string GetUserName()
{
return "管理员用户";
}
public int Age
{
get { return 30; }
}
}
实现接口后,我们可以通过接口类型来引用不同的实现类对象,实现多态效果:
class Program
{
static void Main(string[] args)
{
IUserOperation user1 = new NormalUser();
IUserOperation user2 = new AdminUser();
Console.WriteLine(user1.GetUserName()); // 输出:普通用户
Console.WriteLine(user2.GetUserName()); // 输出:管理员用户
}
}
接口的继承特性
C#中的接口可以继承其他接口,子接口会继承父接口中所有的成员声明,实现子接口的类需要同时实现子接口和父接口中的所有成员。
接口继承的示例代码如下:
// 父接口:基础操作接口
public interface IBaseOperation
{
void Init();
}
// 子接口:继承IBaseOperation,新增自己的成员
public interface IAdvancedOperation : IBaseOperation
{
void Execute();
}
// 实现子接口的类,需要实现Init和Execute两个方法
public class OperationImpl : IAdvancedOperation
{
public void Init()
{
Console.WriteLine("初始化操作");
}
public void Execute()
{
Console.WriteLine("执行操作");
}
}
接口编写的注意事项
- 接口中不能包含字段、构造函数、析构函数,也不能给成员写具体实现
- 一个类可以同时实现多个接口,多个接口之间用逗号分隔
- 如果类继承了父类又实现了接口,父类要写在接口前面,格式为
class 类名 : 父类, 接口1, 接口2 - 接口的成员默认都是public的,实现的时候不能修改访问修饰符,必须保持public
- 如果接口中声明了属性,实现的时候需要按照接口的要求实现对应的get或者set访问器
接口的适用场景
当需要定义一组类共同遵循的规范,但是不同类的实现逻辑不同时,就适合使用接口。比如数据访问层的不同数据库操作类、不同日志输出方式的实现类、不同支付渠道的对接类等场景,都可以通过接口来统一规范,降低代码之间的耦合度,方便后续扩展和维护。