接口 interface 入门
接口 interface 定义了一组契约(方法、属性、事件签名),不关心具体怎么实现。面向接口编程的核心好处是:依赖抽象而不是具体实现,方便替换和测试。
自己理解最深的场景:业务层依赖 IRepository 接口,具体有 SqlRepository、MemoryRepository 两种实现。单元测试时用 MemoryRepository 不用连数据库,换数据库只改注入。这就是依赖倒置原则。
注意事项:1) 一个类可以实现多个接口,但只能继承一个类;2) 接口里不能写字段;3) 接口命名通常用 I 开头;4) .NET 8 后接口可以有默认实现。
代码示例
// 定义接口
public interface IRepository<T>
{
Task<T?> GetByIdAsync(int id);
Task<List<T>> GetAllAsync();
Task AddAsync(T entity);
}
// 实现:SQL 版本
public class SqlRepository<T> : IRepository<T>
{
public async Task<T?> GetByIdAsync(int id)
{
// 实际查数据库
return default;
}
public async Task<List<T>> GetAllAsync() => new();
public async Task AddAsync(T entity) { }
}
// 实现:内存版本(测试用)
public class MemoryRepository<T> : IRepository<T>
{
private List<T> _data = new();
public Task<T?> GetByIdAsync(int id) => Task.FromResult(_data.FirstOrDefault());
public Task<List<T>> GetAllAsync() => Task.FromResult(_data);
public Task AddAsync(T entity) { _data.Add(entity); return Task.CompletedTask; }
}
学习小结:以上是我学习这个知识点时的笔记和心得。技术学习没有捷径,多写多练多踩坑,自然就掌握了。如果这篇笔记对你有帮助,欢迎继续看看其他文章。