接口与抽象类
interface 定义、显式实现、默认接口方法(C# 8)、abstract
接口与抽象类
接口定义"能做什么",抽象类提供"部分怎么做"。C# 8+ 的接口可以有默认实现。
学完本章你将: 掌握 interface、显式实现、默认接口方法、abstract 抽象类。
Interface 定义与实现
csharp
public interface ILogger
{
void Log(string message);
void LogError(string message) => Log($"[ERROR] {message}"); // C# 8+ 默认实现
}
public interface IFormatter
{
string Format(string message);
}
// 实现多个接口
public class ConsoleLogger : ILogger, IFormatter
{
public void Log(string message) => Console.WriteLine(message);
public string Format(string message) => $"[{DateTime.Now}] {message}";
}
显式接口实现
csharp
public class MultiLogger : ILogger, IFormatter
{
// 显式实现——避免命名冲突
void ILogger.Log(string msg) => Console.WriteLine($"LOG: {msg}");
string IFormatter.Format(string msg) => $"[{msg}]";
// 只能通过接口调用的方法
}
// var logger = new MultiLogger();
// logger.Log("test"); // ❌ 编译错误
((ILogger)logger).Log("test"); // ✅
抽象类
csharp
public abstract class Repository<T>
{
// 抽象方法——子类必须实现
public abstract Task<T?> GetByIdAsync(int id);
// 虚方法——子类可选重写
public virtual async Task<T> GetOrThrowAsync(int id)
{
return await GetByIdAsync(id)
?? throw new NotFoundException($"ID {id} 不存在");
}
}
| Interface | Abstract Class | |
|---|---|---|
| 继承 | 可实现多个 | 只能继承一个 |
| 成员 | 方法/属性/事件/索引器 | 字段/构造/完整实现 |
| 默认实现 | C# 8+ 支持 | 一直支持 |