C# 接口完全指南:定义契约、实现多态与解耦设计
接口定义为语法契约,所有继承接口的类必须遵循。接口定义"是什么",派生类定义"怎么做"。
接口定义属性、方法、事件(仅声明)。实现成员由派生类负责。接口提供派生类遵循的标准结构。抽象类类似但用于少量方法由基类声明、派生类实现功能的场景。
声明接口
使用 interface 关键字,成员默认 public:
public interface ITransactions {
void showTransaction();
double getAmount();
}
实现接口示例
using System;
namespace InterfaceApplication {
public interface ITransactions {
void showTransaction();
double getAmount();
}
public class Transaction : ITransactions {
private string tCode, date;
private double amount;
public Transaction() { tCode = " "; date = " "; amount = 0.0; }
public Transaction(string c, string d, double a) { tCode = c; date = d; amount = a; }
public double getAmount() { return amount; }
public void showTransaction() {
Console.WriteLine("Transaction: {0}", tCode);
Console.WriteLine("Date: {0}", date);
Console.WriteLine("Amount: {0}", getAmount());
}
}
class Tester {
static void Main(string[] args) {
Transaction t1 = new Transaction("001", "8/10/2012", 78900.00);
Transaction t2 = new Transaction("002", "9/10/2012", 451900.00);
t1.showTransaction();
t2.showTransaction();
Console.ReadKey();
}
}
}
输出:
Transaction: 001
Date: 8/10/2012
Amount: 78900
Transaction: 002
Date: 9/10/2012
Amount: 451900
接口核心特性
- 接口成员隐式
public,不能显式声明访问修饰符 - 接口不能包含字段(但可包含属性、索引器、事件)
- 类可实现多个接口(逗号分隔),实现多重继承效果
- 接口可继承其他接口
- 显式接口实现:
void ITransactions.showTransaction() { ... }仅通过接口引用访问
接口 vs 抽象类
| 特性 | 接口 | 抽象类 |
|---|---|---|
| 多重实现 | 类可实现多个接口 | 只能继承一个基类 |
| 成员实现 | 仅声明(C# 8.0+ 可有默认实现) | 可包含完整实现 |
| 构造函数 | 无 | 可有 |
| 字段/状态 | 无实例字段 | 可有实例字段 |
| 访问修饰符 | 隐式 public | 可任意修饰符 |
| 用途 | 定义契约、能力 | 共享实现、基类 |
C# 8.0+ 接口新特性
- 默认实现:接口方法可提供默认实现,实现类可不重写
- 静态成员:接口可包含静态方法/字段/属性
- 私有成员:接口可包含私有辅助方法
默认实现示例
interface ILogger {
void Log(string msg);
void LogError(string msg) => Log($"ERROR: {msg}"); // 默认实现
}
class ConsoleLogger : ILogger {
public void Log(string msg) => Console.WriteLine(msg);
// LogError 自动继承默认实现
}
依赖倒置原则 (DIP) 实践
// 高层模块依赖抽象
interface IRepository { T GetById(int id); void Save(T entity); }
// 低层实现
class SqlRepository : IRepository { ... }
class MockRepository : IRepository { ... }
// 使用:构造函数注入
class UserService {
private readonly IRepository _repo;
public UserService(IRepository repo) => _repo = repo;
}
接口是实现松耦合、可测试、可扩展架构的关键。
C语言
- 长车道无线监测方案:树莓派集成低成本驱动道传感器
- SPICE 命令行界面使用详解
- 掌握 C# 接口:定义、实现与实战场景全解析
- C++接口编程:抽象类与纯虚函数实现规范契约
- 精通 Java 接口:概念、实现与最佳实践
- Java 集合框架:核心接口、实现类与实战用法
- Java Collection 接口:核心概念与常用方法
- 精通 Java Queue 接口:方法、实现类与实战应用
- 掌握 Java NavigableSet 接口:导航、排序与实战示例
- 掌握 Java Lambda 表达式:从基础到 Stream API 实战
- Java 接口全解析:定义契约、默认方法、多实现与标记接口
- Java 9 接口私有方法:增强封装与代码复用