C#高级语法--接口

news2025/4/28 2:13:40

先引用一些通俗一点的话语说明

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个核心作用

  1. 统一标准:像“USB插座”一样,让不同设备兼容。
  2. 简化调用:像“老板的任务清单”,不管员工怎么干,只管结果。
  3. 灵活替换:像“快递服务”,随时切换实现,不影响业务。
  4. 扩展功能:像“游戏模组”,动态增加新功能。

初学牢记
✅ 接口是“做什么”的约定(比如“充电”、“发货”)。
❌ 接口不关心“怎么做”(具体实现由类负责)。

这样理解是不是更简单了? 😉



接口的定义语法

[访问修饰符] 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 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2343286.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【尚硅谷Redis6】自用学习笔记

Redis介绍 Redis是单线程 多路IO复用技术&#xff08;类似黄牛买票&#xff09; 默认有16个库&#xff0c;用select进行切换 默认端口号为6379 Memcached&#xff1a;多线程 锁&#xff08;数据类型单一&#xff0c;不支持持久化&#xff09; 五大常用数据类型 Redis key …

Vue里面elementUi-aside 和el-main不垂直排列

先说解决方法 main.js少导包 import element-ui/lib/theme-chalk/index.css; //加入此行即可 问题复现 排查了一个小时终于找出来问题了&#xff0c;建议导包去看官方的文档&#xff0c;作者就是因为看了别人的导包流程导致的问题 导包官网地址Element UI导包快速入门

VS Code搭建C/C++开发环境

文章目录 一、VScode 是什么?二、VScode的下载和安装1、下载2、安装 三、环境介绍1、安装中文插件 四、VScode配置 C/C开发环境1、下载MinGW-w64 编译器套件2、配置MingGW643、验证4、安装C/C插件 五、在VSCode上编写C语言代码并编译成功1、打开文件夹2、新建C语言文件&#x…

mysql 在 dbeaver中下载驱动失败处理

直接上解决方法 1. 在mysql官网下载驱动 2. 引入dbeaver中即可 3. 最后再双击即可

Java 安全:如何防止 SQL 注入与 XSS 攻击?

Java 安全&#xff1a;如何防止 SQL 注入与 XSS 攻击&#xff1f; 在 Java 开发领域&#xff0c;安全问题至关重要&#xff0c;而 SQL 注入和 XSS 攻击是两种常见的安全威胁。本文将深入探讨如何有效防止这两种攻击&#xff0c;通过详细代码实例为您呈现解决方案。 一、SQL 注…

fastbev mmdetection3D 角度和方向损失

角度/方向损失 sin(a−b)sinacosb−cosasinb config参数 dir_offset0.7854, # pi/4 dir_limit_offset0, box编解码 # Copyright (c) OpenMMLab. All rights reserved. import torchfrom mmdet.core.bbox import BaseBBoxCoder from mmdet.core.bbox.builder import BBOX_COD…

一种专用车辆智能配电模块的设计解析:技术革新与未来展望

关键词&#xff1a;智能配电模块、STM32、CAN总线、电子开关、新能源汽车 引言&#xff1a;传统配电系统的痛点与智能化转型 传统配电系统依赖继电器和保险丝&#xff0c;存在体积大、寿命短、智能化低等缺陷&#xff08;如图1&#xff09;。而新能源汽车和无人驾驶技术对配电…

《深入浅出ProtoBuf:从环境搭建到高效数据序列化》​

ProtoBuf详解 1、初识ProtoBuf2、安装ProtoBuf2.1、ProtoBuf在Windows下的安装2.2、ProtoBuf在Linux下的安装 3、快速上手——通讯录V1.03.1、步骤1&#xff1a;创建.proto文件3.2、步骤2&#xff1a;编译contacts.proto文件&#xff0c;生成C文件3.3、步骤3&#xff1a;序列化…

Java实现加密(七)国密SM2算法的签名和验签(附商用密码检测相关国家标准/国密标准下载)

目录 一、国密标准中&#xff0c;关于SM2签名验签的定义二、SM2签名和验签的实现原理1. 前置知识2. 签名生成过程3. 验签过程4. 数学正确性证明5. 安全性与注意事项 三、带userId、不带userId的区别1. 核心区别2.算法区别(1) 哈希计算过程(2) 签名验签流程 四、Java代码实现1. …

【华为HCIP | 华为数通工程师】821—多选解析—第十七页

多选835、IS-IS协议所使用的NSAP地址主要由哪几个部分构成? A、AREA ID B、SEL C、DSCp D、SYSTEM ID 解析:NSAP地址:网络服务访问点(Network Service Access Point)是 OSI 协议中用于定位资源的地址。NSAP 的地址结构如图所示,它由 IDP(Initial Domain …

函数的定义与使用(python)

lst[:]是传入lst的拷贝。改变它对原始lst没有任何影响。 *list一个*的元素在函数体内会被当成一个元组。 以下是对图中 Python 代码的详细解释&#xff1a; 代码总体功能 这段代码定义了一个生成器函数 getItem &#xff0c;用于依次返回多个列表中的元素。然后通过循环遍历…

List findIntersection getUnion

List findIntersection & getUnion 求两个列表的交集和并集 package zwf;import java.util.ArrayList; import java.util.LinkedHashSet; import java.util.List;/*** 列表工具类* * author ZengWenFeng* date 2025.04.22* mobile 13805029595* email 117791303qq.com*/ p…

乒乓操作(Ping-Pong)

乒乓操作 “ 乒乓操作” 是一个常常应用于数据流控制的设计思想&#xff0c; 典型的乒乓操作方法如下图 所示&#xff1a; ​ T1周期&#xff0c;输入数据流1缓存到数据缓冲模块1中&#xff0c;如上图棕色&#xff1b;T2周期&#xff0c;输入数据流2缓存到数据缓冲模块2中&…

微信小程序文章管理系统开发实现

概述 在内容为王的互联网时代&#xff0c;高效的文章管理系统成为各类平台的刚需。幽络源平台今日分享一款基于SSM框架开发的微信小程序文章管理系统完整解决方案&#xff0c;该系统实现了多角色内容管理、智能分类、互动交流等功能。 主要内容 一、用户端功能模块 ​​多角…

GrassRouter 小草MULE多5G多链路聚合通信路由设备在应急场景的聚合效率测试报告及解决方案

在应急通信场景中&#xff0c;快速、稳定、高效的通信链路是保障救援工作顺利开展的关键。MULE&#xff08;Multi-Link Unified Link Enhancement&#xff09;多链路聚合路由通信设备作为一种新型的通信技术解决方案&#xff0c;通过聚合多条通信链路&#xff08;如4G/5G、卫星…

【MySQL】MySQL索引与事务

目录 前言 1. 索引 &#xff08;index&#xff09; 1.1 概念 1.2 作用 1.3 使用场景 1.4 索引的相关操作 查看索引 创建索引 删除索引 2. 索引背后的数据结构 2.1 B树 2.2 B&#xff0b;树的特点 2.3 B&#xff0b;树的优势 3. 事务 3.1 为什么使用事务 3.2 事…

华为网路设备学习-19 IGP路由专题-路由策略

一、 二、 注意&#xff1a; 当该节点匹配模式为permit下时&#xff0c;参考if else 当该节点匹配模式为deny下时&#xff1a; 1、该节点中的apply子语句不会执行。 2、如果满足所有判断&#xff08;if-match&#xff09;条件时&#xff0c;拒绝该节点并跳出&#xff08;即不…

基于DrissionPage的表情包爬虫实现与解析(含源码)

目录 ​编辑 一、环境配置与技术选型 1.1 环境要求 1.2 DrissionPage优势 二、爬虫实现代码 三、代码解析 3.1 类结构设计 3.2 目录创建方法 3.3 图片链接获取 3.4 图片下载方法 四、技术升级对比 4.1 代码复杂度对比 4.2 性能测试数据 五、扩展优化建议 5.1 并…

区间和数量统计 之 前缀和+哈希表

文章目录 1512.好数对的数目2845.统计趣味子数组的数目1371.每个元音包含偶数次的最长子字符串 区间和的数量统计是一类十分典型的问题&#xff1a;记录左边&#xff0c;枚举右边策略前置题目&#xff1a;统计nums[j]nums[i]的对数进阶版本&#xff1a;统计子数组和%modulo k的…

全能 Sui 技术栈,构建 Web3 的未来

本文翻译自&#xff1a;FourPillarsFP&#xff0c;文章仅代表作者观点。 2025 年&#xff0c;SuiNetwork正在以一套全栈区块链策略强势出击&#xff0c;彻底打破加密行业的传统范式。正如 Mysten Labs 联合创始人 Adeniyi Abiodun 所说&#xff1a;“Sui 不只是一条区块链&…