在C#中,接口(interface)是一种引用类型,它定义了一组成员(方法、属性、事件、索引器)的签名,但不提供实现。类或结构体通过冒号语法来实现接口,并必须补全这些成员。接口的核心价值在于制定契约、解耦模块以及支持多态,让程序在扩展时不用大改原有代码。

接口的基本写法
下面是一个最简单的接口与实现示例,展示了如何定义行为契约并由不同类完成:
// 定义支付接口
public interface IPayment
{
void Pay(decimal amount);
}
// 微信支付实现
public class WechatPay : IPayment
{
public void Pay(decimal amount)
{
Console.WriteLine("微信支付:" + amount);
}
}
// 支付宝支付实现
public class AliPay : IPayment
{
public void Pay(decimal amount)
{
Console.WriteLine("支付宝支付:" + amount);
}
}
接口的主要作用
1. 制定统一契约
接口让调用方只依赖抽象而不依赖细节。例如上层业务只调用 IPayment.Pay(),不必知道背后是哪家支付渠道。
2. 降低耦合便于替换
当需求变化,比如从微信支付切换到支付宝,只需替换实现类,业务代码无需改动:
class OrderService
{
private IPayment _payment;
public OrderService(IPayment payment)
{
_payment = payment;
}
public void Checkout(decimal money)
{
_payment.Pay(money);
}
}
3. 支持多态与单元测试
因为接口可被多个类实现,一个接口变量能指向任意实现对象。测试时还能传入模拟类,隔离数据库或网络。
接口与抽象类的区别
| 对比项 | 接口 | 抽象类 |
|---|---|---|
| 成员实现 | 默认无实现 | 可有具体方法 |
| 继承数量 | 可实现多个 | 只能继承一个 |
| 适用场景 | 行为契约 | 共性基类 |
使用建议
- 面向接口编程,类之间尽量通过接口交互
- 接口粒度要小,避免定义庞大杂烩接口
- 需要默认行为或共享状态时再用抽象类
掌握C#接口的用法,能显著提升代码的可维护性和扩展能力,是编写清晰架构的重要一步。