C# 接口隔离的一个案例
两种写法:
第一种
public interface ILynkLaserPowerMeter : ILaserPowerMeter, IContinuousDataOutputControl, IAccelerateMeasurementControl{
} public class LynkLaserPowerMeter : ILynkLaserPowerMeter
第二种
public class LynkLaserPowerMeter : ILaserPowerMeter, IContinuousDataOutputControl, IAccelerateMeasurementControl
{
}
第一种写法的优势:
-
接口隔离 - 创建了专门的接口,符合接口隔离原则
-
维护性好 - 如果接口组合需要变化,只需修改
ILynkLaserPowerMeter定义 -
语义清晰 - 明确表达了"Lynk激光功率计"的概念
-
扩展性强 - 可以在
ILynkLaserPowerMeter中添加品牌特有的方法 -
使用方便 - 依赖注入时只需引用一个接口
第二种写法的问题:
-
重复代码 - 每个实现类都要写相同的接口列表
-
维护困难 - 接口组合变化时需要修改所有实现类
-
语义模糊 - 没有明确的"Lynk"概念接口
-
依赖复杂 - 使用时需要引用多个接口
推荐的最佳实践:
// 定义品牌专用接口
public interface ILynkLaserPowerMeter : ILaserPowerMeter, IContinuousDataOutputControl, IAccelerateMeasurementControl
{// 可以添加Lynk品牌特有的方法bool LynkSpecificMethod();
}// 实现类
public class LynkLaserPowerMeter : ILynkLaserPowerMeter
{// 实现所有接口方法public bool LynkSpecificMethod(){// Lynk品牌特有功能return true;}
}// 使用时的优势
public class LaserPowerMeterService
{private readonly ILynkLaserPowerMeter _lynkPowerMeter;public LaserPowerMeterService(ILynkLaserPowerMeter lynkPowerMeter){_lynkPowerMeter = lynkPowerMeter;}public void DoWork(){_lynkPowerMeter.GetPower(out double power);_lynkPowerMeter.LynkSpecificMethod(); // 品牌特有功能}
}
结论:第一种写法更符合面向对象设计原则,具有更好的可维护性和扩展性。
