默认接口方法是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();
}
}
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();
}
}
接口设计原则:
实现优先级:
默认接口方法为C#带来了更灵活的代码组织方式,特别适合:
通过合理使用这一特性,我们可以创建更加模块化和可维护的代码结构。但同时也要注意避免过度使用,保持接口的简单性和清晰性。
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!