编辑
2025-10-15
C#
00

目录

基本语法
实际应用案例
基础照明接口
定时功能接口
闪烁功能接口
具体实现类
功能测试
注意事项
总结

默认接口方法是C# 8.0引入的一个重要特性。它允许我们在接口中定义方法的默认实现,这为代码复用和接口演进提供了新的可能性,其实这么玩下去,与抽象类接近了,现在本来就少用抽象类了。

基本语法

C#
// 基本接口定义 public interface IBasic { // 传统接口方法声明 void RegularMethod(); // 带默认实现的方法 public void DefaultMethod() { Console.WriteLine("这是默认实现"); } }

实际应用案例

我们通过一个智能家居照明系统的例子来详细说明接口应用,特别是默认实现。

基础照明接口

C#
public interface ILight { void SwitchOn(); void SwitchOff(); bool IsOn(); // 默认实现的电源状态检查 public PowerStatus Power() => PowerStatus.NoPower; } public enum PowerStatus { NoPower, ACPower, FullBattery, MidBattery, LowBattery }

定时功能接口

C#
public interface ITimerLight : ILight { // 带默认实现的定时功能 public async Task TurnOnFor(int duration) { // 默认实现使用基本的开关控制 Console.WriteLine("启动默认定时功能"); SwitchOn(); await Task.Delay(duration); SwitchOff(); Console.WriteLine("定时功能完成"); } }

闪烁功能接口

C#
public interface IBlinkingLight : ILight { // 带默认实现的闪烁功能 public async Task Blink(int duration, int repeatCount) { Console.WriteLine("启动默认闪烁功能"); for (int i = 0; i < repeatCount; i++) { SwitchOn(); await Task.Delay(duration); SwitchOff(); await Task.Delay(duration); } Console.WriteLine("闪烁功能完成"); } }

具体实现类

C#
// 基础照明设备 - 使用所有默认实现 public class BasicLight : ILight, ITimerLight, IBlinkingLight { private bool isOn; public void SwitchOn() => isOn = true; public void SwitchOff() => isOn = false; public bool IsOn() => isOn; } // 高级LED灯 - 重写部分默认实现 public class AdvancedLEDLight : ILight, ITimerLight, IBlinkingLight { private bool isOn; private readonly string deviceId; public AdvancedLEDLight(string id) { deviceId = id; } public void SwitchOn() => isOn = true; public void SwitchOff() => isOn = false; public bool IsOn() => isOn; // 自定义闪烁实现 public async Task Blink(int duration, int repeatCount) { Console.WriteLine($"LED灯 {deviceId} 使用硬件闪烁功能"); await Task.Delay(duration * repeatCount); Console.WriteLine("闪烁完成"); } }

功能测试

C#
internal class Program { static async Task Main(string[] args) { BasicLight light = new BasicLight(); Console.WriteLine($"测试灯具: {light.GetType().Name}"); // 基本功能测试 light.SwitchOn(); Console.WriteLine($"开启状态: {light.IsOn()}"); // 使用模式匹配测试高级功能 if (light is ITimerLight timer) { Console.WriteLine("测试定时功能"); await timer.TurnOnFor(1000); } if (light is IBlinkingLight blinker) { Console.WriteLine("测试闪烁功能"); await blinker.Blink(500, 3); } Console.ReadLine(); } }

image.png

C#
internal class Program { static async Task Main(string[] args) { var light = new AdvancedLEDLight("ABC"); Console.WriteLine($"测试灯具: {light.GetType().Name}"); // 基本功能测试 light.SwitchOn(); Console.WriteLine($"开启状态: {light.IsOn()}"); // 使用模式匹配测试高级功能 if (light is ITimerLight timer) { Console.WriteLine("测试定时功能"); await timer.TurnOnFor(1000); } if (light is IBlinkingLight blinker) { Console.WriteLine("测试闪烁功能"); await blinker.Blink(500, 3); } Console.ReadLine(); } }

image.png

注意事项

接口设计原则

  • 保持接口小而专注
  • 每个接口专注于一个特定功能
  • 避免在多个派生接口中重写相同的方法

实现优先级

  • 类中的显式实现优先级最高
  • 最具体的接口实现其次
  • 默认接口实现优先级最低

总结

默认接口方法为C#带来了更灵活的代码组织方式,特别适合:

  • 接口的演进
  • 可选功能的实现
  • 行为的组合
  • 代码的复用

通过合理使用这一特性,我们可以创建更加模块化和可维护的代码结构。但同时也要注意避免过度使用,保持接口的简单性和清晰性。

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!