C#高级语法--接口
先引用一些通俗一点的话语说明
1. 接口就像“插座标准”(解耦)
🧩 场景:
- 你家的手机充电器(USB-C、Lightning)必须插进匹配的插座才能充电。
- 问题:如果每个手机品牌插座都不一样,你换手机就得换充电器,太麻烦了!
💡 接口的作用:
-
- 定义一个通用的充电口标准(比如USB-C),所有手机厂商(华为、小米、苹果)只要按这个标准做充电口,你就能用同一根线充电。
// 定义“充电标准”接口
public interface ICharger
{void Charge();
}// 华为手机实现接口
public class Huawei : ICharger
{public void Charge() => Console.WriteLine("华为快充中...");
}// 苹果手机实现接口
public class iPhone : ICharger
{public void Charge() => Console.WriteLine("苹果慢充中...");
}// 用户只需要一个充电器,不管手机品牌
ICharger phone1 = new Huawei();
ICharger phone2 = new iPhone();
phone1.Charge(); // 输出:华为快充中...
phone2.Charge(); // 输出:苹果慢充中...
✅ 好处:
换手机不用换充电器(代码里换实现类,不用改其他代码)。
2. 接口就像“任务清单”(多态)
🧩 场景:
- 公司老板让员工做任务,但不同员工(程序员、设计师)完成任务的方式完全不同。
- 问题:如果老板要针对每个人写不同的指令,累死人!
💡 接口的作用:
- 老板只发一个统一的任务清单(接口),具体怎么做员工自己实现。
- 代码示例:
// 定义“任务”接口
public interface ITask
{void DoWork();
}// 程序员实现
public class Programmer : ITask
{public void DoWork() => Console.WriteLine("写代码...");
}// 设计师实现
public class Designer : ITask
{public void DoWork() => Console.WriteLine("画图...");
}// 老板只需要喊“干活”,不管是谁
List<ITask> team = new List<ITask> { new Programmer(), new Designer() };
foreach (var person in team)
{person.DoWork();
}
// 输出:
// 写代码...
// 画图...
✅ 好处:
老板不用管细节(代码只需调用接口,不用关心具体是谁实现的)。
3. 接口就像“快递柜”(依赖注入)
🧩 场景:
- 你网购时,快递可以放快递柜、家门口或驿站,但卖家不关心具体放哪。
- 问题:如果卖家必须知道你家地址才能发货,太复杂了!
💡 接口的作用:
- 卖家只认“快递服务”接口,具体用哪家快递(顺丰、京东)由买家决定。
- 代码示例:
// 定义“快递服务”接口
public interface IDelivery
{void Send(string package);
}// 顺丰快递
public class SFDelivery : IDelivery
{public void Send(string package) => Console.WriteLine($"顺丰已发出:{package}");
}// 京东快递
public class JDDelivery : IDelivery
{public void Send(string package) => Console.WriteLine($"京东已发出:{package}");
}// 卖家只管发货,不关心快递公司
public class Seller
{private readonly IDelivery _delivery;// 构造函数传入快递服务(依赖注入)public Seller(IDelivery delivery) => _delivery = delivery;public void Sell(string product){_delivery.Send(product);}
}// 买家选择顺丰
Seller seller = new Seller(new SFDelivery());
seller.Sell("iPhone 15"); // 输出:顺丰已发出:iPhone 15
✅ 好处:
卖家不用改代码,想换快递就换(比如换成new JDDelivery()
)。
4. 接口就像“游戏外挂”(插件系统)
🧩 场景:
- 你玩《原神》时,可以加模组(比如自动钓鱼),但游戏官方不用提前知道这些功能。
- 问题:如果游戏每次更新都要内置所有功能,程序会超级臃肿!
💡 接口的作用:
- 游戏官方定义“插件接口”,玩家自己写模组,按接口规范加载。
- 代码示例:
// 游戏定义“插件”接口
public interface IPlugin
{void Run();
}// 玩家开发的“自动钓鱼”插件
public class AutoFishingPlugin : IPlugin
{public void Run() => Console.WriteLine("自动钓鱼中...");
}// 游戏启动时加载所有插件
List<IPlugin> plugins = new List<IPlugin> { new AutoFishingPlugin() };
foreach (var plugin in plugins)
{plugin.Run(); // 输出:自动钓鱼中...
}
✅ 好处:
游戏功能可以无限扩展,不用重新编译主程序。
总结:接口的4个核心作用
- 统一标准:像“USB插座”一样,让不同设备兼容。
- 简化调用:像“老板的任务清单”,不管员工怎么干,只管结果。
- 灵活替换:像“快递服务”,随时切换实现,不影响业务。
- 扩展功能:像“游戏模组”,动态增加新功能。
初学牢记:
✅ 接口是“做什么”的约定(比如“充电”、“发货”)。
❌ 接口不关心“怎么做”(具体实现由类负责)。
这样理解是不是更简单了? 😉
接口的定义语法
[访问修饰符] interface IInterfaceName
{// 成员声明(无实现)[成员签名];
}
示例:定义一个简单接口
public interface IAnimal
{// 方法声明(无实现)void MakeSound();// 属性声明 string Name { get; set; }// 事件声明 event EventHandler OnHungry;
}
实现接口的示例
public class Dog : IAnimal
{// 实现接口的属性 public string Name { get; set; }// 实现接口的方法 public void MakeSound(){Console.WriteLine("Woof!");}// 实现接口的事件 public event EventHandler OnHungry;
}
1. 跨平台数据存储(如数据库抽象)
场景:应用程序需要支持多种数据库(SQL Server、MySQL、Oracle),但业务逻辑不应依赖具体数据库实现。
接口设计:
public interface IDatabaseRepository
{void Connect(string connectionString);int ExecuteCommand(string sql);DataTable Query(string sql);
}
具体实现:
public class SqlServerRepository : IDatabaseRepository
{public void Connect(string connectionString) => Console.WriteLine("SQL Server connected");public int