C# 默認接口方法詳解
作者:iamrick
通過合理使用這一特性,我們可以創建更加模塊化和可維護的代碼結構。但同時也要注意避免過度使用,保持接口的簡單性和清晰性。
默認接口方法是C# 8.0引入的一個重要特性。它允許我們在接口中定義方法的默認實現,這為代碼復用和接口演進提供了新的可能性,其實這么玩下去,與抽象類接近了,現在本來就少用抽象類了。
基本語法
// 基本接口定義
public interface IBasic
{
// 傳統接口方法聲明
void RegularMethod();
// 帶默認實現的方法
public void DefaultMethod()
{
Console.WriteLine("這是默認實現");
}
}
實際應用案例
我們通過一個智能家居照明系統的例子來詳細說明接口應用,特別是默認實現。
基礎照明接口
public interface ILight
{
void SwitchOn();
void SwitchOff();
bool IsOn();
// 默認實現的電源狀態檢查
public PowerStatus Power() => PowerStatus.NoPower;
}
publicenum PowerStatus
{
NoPower,
ACPower,
FullBattery,
MidBattery,
LowBattery
}
定時功能接口
public interface ITimerLight : ILight
{
// 帶默認實現的定時功能
public async Task TurnOnFor(int duration)
{
// 默認實現使用基本的開關控制
Console.WriteLine("啟動默認定時功能");
SwitchOn();
await Task.Delay(duration);
SwitchOff();
Console.WriteLine("定時功能完成");
}
}
閃爍功能接口
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("閃爍功能完成");
}
}
具體實現類
// 基礎照明設備 - 使用所有默認實現
publicclass BasicLight : ILight, ITimerLight, IBlinkingLight
{
privatebool isOn;
public void SwitchOn() => isOn = true;
public void SwitchOff() => isOn = false;
public bool IsOn() => isOn;
}
// 高級LED燈 - 重寫部分默認實現
publicclass AdvancedLEDLight : ILight, ITimerLight, IBlinkingLight
{
privatebool 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("閃爍完成");
}
}
功能測試
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();
}
}
圖片
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#帶來了更靈活的代碼組織方式,特別適合:
- 接口的演進
- 可選功能的實現
- 行為的組合
- 代碼的復用
通過合理使用這一特性,我們可以創建更加模塊化和可維護的代碼結構。但同時也要注意避免過度使用,保持接口的簡單性和清晰性。
責任編輯:武曉燕
來源:
技術老小子