当前位置: 首页 > news >正文

子类不依赖泛型,重写父类方法,通过强制类型转换父类方法参数出现的问题。——— 一个例子引发的思考

  1. 使用泛型(推荐)

    1. public interface FlowHandlerGateway<P extends FlowApprovalPageCondition> {Page<FlowApprovalPage> pageQuery(P condition);
      }//父类
      @Slf4j
      @Component
      @RequiredArgsConstructor
      public class FlowHandlerGatewayImpl<P extends FlowApprovalPageCondition> implements FlowHandlerGateway<P>{private final FlowApprovalWrapper flowApprovalWrapper;private final InfraConverter converter;private final CommonAdapter commonAdapter;@Overridepublic Page<FlowApprovalPage> pageQuery(P condition) {Page<FlowApprovalPO> pageInfo = commonAdapter.toPage(condition);LambdaQueryWrapper<FlowApprovalPO> wrapper = Wrappers.<FlowApprovalPO>lambdaQuery().eq(StrUtil.isNotBlank(condition.getBizNo()), FlowApprovalPO::getBizNo, condition.getBizNo()).eq(StrUtil.isNotBlank(condition.getFlowType()), FlowApprovalPO::getFlowType, condition.getFlowType()).eq(ObjectUtil.isNotNull(condition.getInstanceId()), FlowApprovalPO::getInstanceId, condition.getInstanceId()).eq(StrUtil.isNotBlank(condition.getFlowStatus()), FlowApprovalPO::getFlowStatus, condition.getFlowStatus()).eq(ObjectUtil.isNotNull(condition.getApplyBy()), FlowApprovalPO::getApplyBy, condition.getApplyBy()).like(StrUtil.isNotBlank(condition.getApplyByName()), FlowApprovalPO::getApplyByName, condition.getApplyByName()).ge(ObjectUtil.isNotNull(condition.getApplyStartTime()), FlowApprovalPO::getCreatedAt, condition.getApplyStartTime()).le(ObjectUtil.isNotNull(condition.getApplyEndTime()), FlowApprovalPO::getCreatedAt, condition.getApplyEndTime());// Wrapper拓展方法pageQueryWrapperExpand(wrapper, condition);return converter.toFlowApprovalPage(flowApprovalWrapper.page(pageInfo, wrapper));}protected void pageQueryWrapperExpand(LambdaQueryWrapper<FlowApprovalPO> wrapper, P conditionPage){}
      }/*** 子类*/
      @Component
      @Slf4j
      public class SimulationLoginGatewayImpl extends FlowHandlerGatewayImpl<SimulationLoginPageCondition>{public SimulationLoginGatewayImpl(FlowApprovalWrapper flowApprovalWrapper, InfraConverter converter, CommonAdapter commonAdapter) {super(flowApprovalWrapper, converter, commonAdapter);}@Overrideprotected void pageQueryWrapperExpand(LambdaQueryWrapper<FlowApprovalPO> wrapper, SimulationLoginPageCondition condition){wrapper.apply(ObjectUtil.isNotNull(condition.getTenantId()),"biz_data->>'$.tenant_id' = {0}", condition.getTenantId()).apply(ObjectUtil.isNotNull(condition.getApplicationId()),"biz_data->>'$.application_id' = {0}", condition.getApplicationId()).apply(ObjectUtil.isNotNull(condition.getEnableStatus()),"biz_data->>'$.enable_status' = {0}", condition.getEnableStatus()).apply(ObjectUtil.isNotNull(condition.getEmail()),"biz_data->>'$.email' = {0}", condition.getEmail());}}
      
  2. 通过强制类型转换。其中SimulationLoginPageCondition实体继承FlowApprovalPageCondition实体,子类SimulationLoginPageCondition为什么不能使用多态特性,直接重写父类pageQueryWrapperExpand方法    


    1. // 父类
      @Slf4j @Component @RequiredArgsConstructor public class FlowHandlerGatewayImpl implements FlowHandlerGateway{private final FlowApprovalWrapper flowApprovalWrapper;private final InfraConverter converter;private final CommonAdapter commonAdapter;@Overridepublic <P extends FlowApprovalPageCondition> Page<FlowApprovalPage> pageQuery(P condition) {Page<FlowApprovalPO> pageInfo = commonAdapter.toPage(condition);LambdaQueryWrapper<FlowApprovalPO> wrapper = Wrappers.<FlowApprovalPO>lambdaQuery().eq(StrUtil.isNotBlank(condition.getBizNo()), FlowApprovalPO::getBizNo, condition.getBizNo()).eq(StrUtil.isNotBlank(condition.getFlowType()), FlowApprovalPO::getFlowType, condition.getFlowType()).eq(ObjectUtil.isNotNull(condition.getInstanceId()), FlowApprovalPO::getInstanceId, condition.getInstanceId()).eq(StrUtil.isNotBlank(condition.getFlowStatus()), FlowApprovalPO::getFlowStatus, condition.getFlowStatus()).eq(ObjectUtil.isNotNull(condition.getApplyBy()), FlowApprovalPO::getApplyBy, condition.getApplyBy()).like(StrUtil.isNotBlank(condition.getApplyByName()), FlowApprovalPO::getApplyByName, condition.getApplyByName()).ge(ObjectUtil.isNotNull(condition.getApplyStartTime()), FlowApprovalPO::getCreatedAt, condition.getApplyStartTime()).le(ObjectUtil.isNotNull(condition.getApplyEndTime()), FlowApprovalPO::getCreatedAt, condition.getApplyEndTime());// Wrapper拓展方法pageQueryWrapperExpand(wrapper, condition);return converter.toFlowApprovalPage(flowApprovalWrapper.page(pageInfo, wrapper));}protected void pageQueryWrapperExpand(LambdaQueryWrapper<FlowApprovalPO> wrapper, FlowApprovalPageCondition conditionPage){} }

      /**
      * 子类
      */
      @Component
      @Slf4j
      public class SimulationLoginGatewayImpl extends FlowHandlerGatewayImpl{

      public SimulationLoginGatewayImpl(FlowApprovalWrapper flowApprovalWrapper, InfraConverter converter, CommonAdapter commonAdapter) {
      super(flowApprovalWrapper, converter, commonAdapter);
      }

        // 出现报错,重写方法参数和父类不一样、违反了java规范
      @Override
      protected void pageQueryWrapperExpand(LambdaQueryWrapper<FlowApprovalPO> wrapper, SimulationLoginPageCondition condition){
      wrapper.apply(ObjectUtil.isNotNull(condition.getTenantId()),"biz_data->>'$.tenant_id' = {0}", condition.getTenantId())
      .apply(ObjectUtil.isNotNull(condition.getApplicationId()),"biz_data->>'$.application_id' = {0}", condition.getApplicationId())
      .apply(ObjectUtil.isNotNull(condition.getEnableStatus()),"biz_data->>'$.enable_status' = {0}", condition.getEnableStatus())
      .apply(ObjectUtil.isNotNull(condition.getEmail()),"biz_data->>'$.email' = {0}", condition.getEmail());
      }
      // 强制类型转换,子类中重写父类方法,也不推荐后面有原因,违反了开闭原则,下面有讲解
      @Override
      protected void pageQueryWrapperExpand(LambdaQueryWrapper<FlowApprovalPO> wrapper, FlowApprovalPageCondition condition) {// 强制类型转换SimulationLoginPageCondition simCondition = (SimulationLoginPageCondition) condition;// 使用转换后的条件wrapper.apply(ObjectUtil.isNotNull(simCondition.getTenantId()),"biz_data->>'$.tenant_id' = {0}", simCondition.getTenantId()).apply(ObjectUtil.isNotNull(simCondition.getApplicationId()),"biz_data->>'$.application_id' = {0}", simCondition.getApplicationId()).apply(ObjectUtil.isNotNull(simCondition.getEnableStatus()),"biz_data->>'$.enable_status' = {0}", simCondition.getEnableStatus()).apply(ObjectUtil.isNotNull(simCondition.getEmail()),"biz_data->>'$.email' = {0}", simCondition.getEmail());
      }


      } 
  3. 原理

    1. 1. 单一职责原则 (Single Responsibility Principle - SRP)

      核心思想:一个类应该只有一个引起它变化的原因。换句话说,一个类应该只负责一项职责。

      在Java中的理解:

      • 好处:类的职责越单一,它的内聚性就越高,就越容易被理解、维护和修改。修改一个功能不会意外影响到其他不相关的功能。

      • ** violation (违反)的例子**:如果一个类既负责数据库操作,又负责业务逻辑计算,还负责发送邮件,那它就违反了SRP。此时,修改数据库连接方式、业务算法或邮件服务器配置都会修改这个类,风险很高。

      结合你的代码:

      • FlowHandlerGatewayImpl 的职责非常明确:构建查询流程审批单的分页条件。它不关心具体的SQL执行(由FlowApprovalWrapper负责),也不关心PO到Domain的转换(由InfraConverter负责)。它通过依赖注入将其他职责委托给了专门的类,这很好地遵循了SRP。


      2. 开闭原则 (Open/Closed Principle - OCP)

      核心思想:软件实体(类、模块、函数等)应该对扩展开放,但对修改关闭。

      在Java中的理解:

      • “对修改关闭”:意味着一个已经完成并测试通过的类的核心代码不应该再被修改。

      • “对扩展开放”:意味着当有新的需求时,你应该能够通过扩展这个类(如通过继承、组合、实现接口等方式)来添加新功能,而不是修改它。

      • 实现手段:抽象(接口、抽象类)和多态是实现OCP的关键。

      结合你的代码:

      • FlowHandlerGatewayImpl 的 pageQueryWrapperExpand 方法是一个空实现(钩子方法)。这本身就是为扩展留下的“窗口”。

      • 当需要为SimulationLoginPageCondition添加特殊的查询条件时,你没有修改 FlowHandlerGatewayImpl 的核心 pageQuery 方法,而是扩展了它,创建了SimulationLoginGatewayImpl子类并重写了pageQueryWrapperExpand方法。

      • 这正是对扩展开放,对修改关闭的完美体现。父类代码稳定,新功能通过子类扩展实现。


      3. 里氏替换原则 (Liskov Substitution Principle - LSP)

      核心思想:所有引用基类(父类)的地方必须能透明地使用其子类的对象,而程序的行为不会发生变化。

      在Java中的理解:

      • 子类可以扩展父类的功能,但不能改变父类原有的功能和行为约定(如方法签名、返回值、异常抛出等)。

      • 子类不应该比父类有更严格的前置条件(比如,父类方法参数是Integer,子类重写时却要求参数必须大于0,这就违反了LSP)。

      • ** violation (违反)的例子:这正是你之前遇到的问题。如果强行在子类中将FlowApprovalPageCondition参数转换为SimulationLoginPageCondition,那么该子类对象就无法透明替换父类对象。因为父类方法可以接受任何FlowApprovalPageCondition,而你的子类方法实际上只接受特定的子类型,传入其他类型会导致ClassCastException,行为被破坏了**。

      正确的做法(结合你的代码):

      • 使用泛型来保证类型安全,从而遵守LSP。

        java
        // 父类
        public class FlowHandlerGatewayImpl<C extends FlowApprovalPageCondition> {public Page<FlowApprovalPage> pageQuery(C condition) { ... }protected void pageQueryWrapperExpand(LambdaQueryWrapper<FlowApprovalPO> wrapper, C condition) {}
        }// 子类
        public class SimulationLoginGatewayImpl extends FlowHandlerGatewayImpl<SimulationLoginPageCondition> {@Overrideprotected void pageQueryWrapperExpand(LambdaQueryWrapper<FlowApprovalPO> wrapper, SimulationLoginPageCondition condition) {// 这里直接使用SimulationLoginPageCondition,无需强制转换,且类型绝对安全}
        }
      • 现在,任何期望使用FlowHandlerGatewayImpl<SimulationLoginPageCondition>的地方,都可以安全地用SimulationLoginGatewayImpl来替换,因为子类方法完全满足父类方法的契约(参数是SimulationLoginPageCondition,它是FlowApprovalPageCondition的子类),行为一致且不会出错。


      4. 扩展性 (Extensibility)

      核心思想:软件系统能够容易地适应新需求、添加新功能,而所需的工作量和成本最低,且对现有系统的影响最小。

      在Java中的理解:

      • 扩展性不是某个单一原则,而是良好应用上述所有原则(SRP, OCP, LSP)以及依赖倒置、接口隔离等原则后的自然结果。

      • 一个高扩展性的系统,其结构是松耦合的,通过抽象和接口定义契约,使得添加新模块就像“插拔组件”一样简单。

      结合你的代码:

      • 你目前的设计(尤其是使用泛型重构后)具有很高的扩展性。

      • 如何添加一个新的流程类型(如DataExportPageCondition)?

        1. 创建新的条件类:DataExportPageCondition extends FlowApprovalPageCondition

        2. 创建新的网关子类:DataExportGatewayImpl extends FlowHandlerGatewayImpl<DataExportPageCondition>

        3. 重写扩展方法:在子类中重写pageQueryWrapperExpand,添加数据导出特有的查询逻辑。

      • 你做到了什么?

        • 没有修改任何现有的、稳定的父类代码(FlowHandlerGatewayImpl) -> 遵循OCP。

        • 新功能在独立的、职责单一的新类中完成 -> 遵循SRP。

        • 新的子类可以完全替换父类,行为一致 -> 遵循LSP。

        • 整个过程的代价极小,风险极低,因为只是添加新代码而不是修改老代码。

      总结

       
      原则核心思想在示例中的体现(良好设计后)
      单一职责 (SRP) 一个类只干一件事 FlowHandlerGatewayImpl只负责构建查询Wrapper,其他职责外包。
      开闭原则 (OCP) 对扩展开放,对修改关闭 通过泛型和可重写的钩子方法,允许无限扩展新的查询条件类型,而无需修改基类。
      里氏替换 (LSP) 子类必须能透明替换父类 使用泛型后,子类SimulationLoginGatewayImpl可以安全替换FlowHandlerGatewayImpl<SimulationLoginPageCondition>
      扩展性 容易添加新功能 添加新流程类型非常简单、快速且安全,是应用上述原则后的必然结果。

      这些原则共同作用,指导我们构建出健壮、灵活、易于维护和扩展的Java应用程序。你代码中最初遇到的问题,正是因为没有很好地满足LSP,进而影响了扩展的优雅性。通过引入泛型,你同时完美地践行了SRP、OCP和LSP,最终获得了极高的扩展性。

             

相关文章:

子类不依赖泛型,重写父类方法,通过强制类型转换父类方法参数出现的问题。——— 一个例子引发的思考

使用泛型(推荐)public interface FlowHandlerGateway<P extends FlowApprovalPageCondition> {Page<FlowApprovalPage> pageQuery(P condition); }//父类 @Slf4j @Component @RequiredArgsConstructor public class FlowHandlerGatewayImpl<P extends FlowApp…...

WebStorm代码一键美化

还在手动调整代码格式?还在为团队代码风格不统一而头疼? 相信很多朋友都遇到过这样的痛苦场景:写完代码一团糟,看着就难受 团队成员代码风格千差万别,维护起来要命 每次提交代码前都要手动整理格式,费时费力上一篇《10分钟搞定Vue3项目》已经搭建好了项目基础架构,脚手架…...

3分钟搞定Vue组件库

还在为写前端页面发愁?还在为设计按钮、表格这些基础组件浪费时间? 经过上一篇《WebStorm代码一键美化》的学习,相信你已经掌握了 Prettier、ESLint、TypeScript 这三大开发神器。 今天,我要教你一个更厉害的招式:3分钟搞定高颜值UI组件库!学会这一招,你的前端开发效率将…...

Golang中设置HTTP请求代理的策略

在Golang中设置HTTP请求代理涉及 net/http包中的 http.Transport结构体,它控制着HTTP请求的细节。要定义代理,可以使用 http.ProxyURL函数配合 url.Parse函数来创建一个 url.URL对象,然后将该对象赋值给 Transport结构体的 Proxy字段。 以下是配置HTTP代理的典型步骤:引入必…...

[开源免费] iGTTS(Gemini TTS) 文本转语音(TTS)的命令行工具。

iGTTS(Gemini TTS) iGTTS(Gemini TTS) 开源免费的文本转语音(TTS)的命令行工具。 iGTTS(Gemini TTS) 是通过调用 Gemini TTS 的接口,实现文本转语音(TTS)的命令行工具。 添加 API key # 编辑 .zshrc: vim ~/.zshrc# 添加信息(导入环境变量): export GEMINI_API_KEY=&l…...

结合Spring和MyBatis实现DAO层操作综述

在Java企业级开发中,Spring框架和MyBatis持久层框架的结合使用已成为常见模式。下面进行详细介绍如何结合这两个框架实现DAO层(数据访问层)操作。 首先,我们需要明确Spring框架和MyBatis的角色定位。Spring是一个全方位的企业级开发框架,提供了包括但不限于依赖注入、事务…...

202205_CHIMA_follow

流量分析,CHIMA,应急响应,文件拼接Tags:流量分析,CHIMA,应急响应 0x00. 题目 附件路径:https://pan.baidu.com/s/1GyH7kitkMYywGC9YJeQLJA?pwd=Zmxh#list/path=/CTF附件 附件名称:202205_CHIMA_follow.zip发起攻击的IP地址受到攻击的资产的IP+Port上传的木马完整路径上传的文…...

Lua脚本协助Redis分布式锁实现命令的原子性

在实现Redis分布式锁的过程中,Lua脚本的使用可以确保命令的原子性,这是因为Redis会将整个Lua脚本执行作为一个不可分割的整体,从而在多客户端环境中保证数据的一致性和安全性。 分布式锁通常是为了在不同进程或服务器间同步访问共享资源。在Redis中,SETNX命令可以用来实现锁…...

快读快写 学习笔记

在OI中,经常有输入输出量巨大的题,这一类题一般需要非常快速的输入输出方式,于是便有了快读快写 下面是模板(原理无需理解,用的时候直接复制上就行): #include <cstdio> #include <cctype> using namespace std; int precision=-1; char buf[100000],*p1=bu…...

Ubuntu 安装 CLion

下载网址:https://www.jetbrains.com/clion/download/?section=linux 安装在 /opt/clion: sudo mkdir /opt/clion 将安装包解压到 /opt/clion: sudo tar -zxvf CLion-2025.2.1.tar.gz -C /opt/clion ls /opt/clion/clion-2025.2.1这样就安装好了。 启动: sh /opt/clion/cl…...

AI编程实战

不久前我用trace体验了一把AI编程,完成了一个股票交易记录软件的开发,这次有个紧急项目,有了上次的AI编程实践,我决定让AI编程帮我一把 工具选择 上次说千问没有IDE,但阿里云出了一个Qoder,在这个紧急项目之前,我刚好开始使用Qoder,接到紧急项目的时候,是时候让AI真正…...

25/9/13(补)

做了下20年csps的单选,错了两道,后边随机跳题了个之前wa的题(p7777 shelter),数学标签,有编号1~n的石子,用两种抓取方式吧石子抓完,第一种抓法是选一个数i把第i堆石子抓走,代价为ip。第二种是选两个数i,j,把第i,j堆石子抓走,代价为|i-j|q。 发现性质: 第一,二种方…...

面向对象编程(OOP)的原则

面向对象编程(OOP)的原则面向对象编程有一系列核心原则,这些原则指导着我们如何设计高质量、可维护和可扩展的软件系统。这些原则可以分为两大类:基本特性和设计原则。 一、面向对象编程的四大基本特性(基石) 1. 封装 (Encapsulation) 核心思想:将数据和对数据的操作捆绑…...

【龙智Atlassian插件】Confluence周报插件上线AI智能总结,一键生成专业报告 - 实践

【龙智Atlassian插件】Confluence周报插件上线AI智能总结,一键生成专业报告 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &q…...

数字化(管理)系统的工具化思考

一、引言:数字化转型的背景与逻辑 进入 21 世纪,信息技术、互联网、大数据、人工智能与物联网的迅速发展,使得企业与组织的运作方式发生了深刻变革。管理学界普遍认为,传统的经验管理与制度管理正逐步向 数字化管理系统 过渡。这不仅是工具更迭的问题,更是认知范式、管理模…...

详细介绍:传统神经网络实现-----手写数字识别(MNIST)项目

详细介绍:传统神经网络实现-----手写数字识别(MNIST)项目pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New",…...

C#语言中使用using关键字

在 C# 语言中,“using”关键字被用于不同的上下文和目的,它的用法大体上可以被分为三类:导入命名空间、简化资源管理和提供别名。 首先,"using"关键字最常见的用途是导入命名空间。这在 C# 程序中非常普遍,因为它可以允许程序员引用命名空间中定义的类型,而不需…...

中育新版本OSS Token获取API分析

中育新版本OSS Token获取API分析 在8/28更新中(或更早),中育彻底停用了旧版本的GenerateTokenAsyncAPI,转而使用GenerateTokenV2AsyncAPI,新的API使用了签名和一些不明所以的参数,并可能限制了可以上传的路径。 为了尽快迁移旧的工具、程序,我对web端的OSS逻辑进行了分析。…...

25/9/12(补,上一篇是9/11的)

把昨天没改完的码积木改完了,最终解法先发现一个性质是往上堆一个就算和下一个高度重叠也对下一个没有影响,所升序排完后设变量m(m初始等于a[1]),如果m比当前遍历到的a[i]大代表这个a[i]有重叠,更新答案,如果比a[i]小就让m=a[i]保持同频。 改完这题后又去改暑假的T3,就是…...

动态编译 vs. 静态编译,容器时代那个更有优势?

动态编译 vs. 静态编译,容器时代那个更有优势?一、动态编译 vs. 静态编译:一场关于“依赖”的战争 要理解静态编译,我们首先要明白它的对立面——动态编译,这也是 C、C++ 以及 Java、Python、C#、Ruby 等大多数主流语言所采用的方式。 1. 动态编译:运行时“借”东西 想象…...

实用指南:操作系统类型全解析:从批处理到嵌入式

实用指南:操作系统类型全解析:从批处理到嵌入式pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace…...

【C++ 类和对象・高阶深化(下)】再探构造函数(含初始化列表),吃透 static 成员、友元、内部类及对象拷贝编译器优化 - 指南

【C++ 类和对象・高阶深化(下)】再探构造函数(含初始化列表),吃透 static 成员、友元、内部类及对象拷贝编译器优化 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: &qu…...

2

C++ 数据结构数组 链表 队列 堆 树 map/set hashmysql 索引 索引就像是数据的目录。索引的好处就是可以提高查询速度,但是会占用物理空间,而且创建和维护索引要耗费时间,每次进行增删改操作都需要动态维护。索引的分类数据结构:B+ 树索引,hash,full-text物理存储:聚簇索…...

VSCode 运行 C/C++ 程序

VSCode 安装插件:重点参考: https://blog.csdn.net/icacxygh001/article/details/120981354 https://code.visualstudio.com/docs/cpp/config-linux#_running-the-build...

3 字节

进程与线程的区别 线程是轻量级进程,每个进程中都有唯一的主线程,主线程和进程是相互依存的关系。进程是资源分配和拥有的基本单位;线程是系统调度的基本单位进程拥有CPU 资源,内存资源,文件资源,句柄等;线程拥有程序计数器,寄存器,栈和状态字切换情况:进程由操作系统…...

Springcloud Alibaba(一)

一、什么是Springcloud Alibaba它是微服务概念的一种实现,解决了如下问题N个服务,如何管理?(服务治理 注册中心【服务的注册、发现、删除】)nacos N个服务,如何通信?feign N个服务,客户端如何访问?gateway N个服务,一旦出现问题了,怎么处理?(容错)sentinel N个服…...

111111111

1111111111...

202204_DASCTF_SimpleFlow

流量分析,DASCTF,WebShell,蚁剑AntSwordTags:流量分析,DASCTF,WebShell,蚁剑AntSword 0x00. 题目 附件路径:https://pan.baidu.com/s/1GyH7kitkMYywGC9YJeQLJA?pwd=Zmxh#list/path=/CTF附件 附件名称:202204_DASCTF_SimpleFlow.zip 0x01. WP 1. 分析http协议,找到附件数据 …...

使用 Winscope 跟踪窗口转换

Winscope 是一款 Web 工具,可以让用户在动画和转换期间和之后记录、重放和分析多个系统服务的状态。Winscope 将所有相关的系统服务状态记录在一个跟踪文件中。使用带有跟踪文件的 Winscope 界面,您可以通过重放、单步执行和调试过渡来针对每个动画帧检查这些服务的状态(无论…...

25/9/12(补)

做了下19csps初试,60多分,记不清了,反正能过,写完后改一道暑假没过的题,没改完就下课了...

深入解析:“纳米总管”——Arduino Nano 的趣味生活

深入解析:“纳米总管”——Arduino Nano 的趣味生活pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monosp…...

洛谷题目难度系统优化

以下为优化后的难度系统:优化后难度 对应KaTex数学公式\(\color{FE4C61}{{入门}}\) \color{FE4C61}{{入门}}\(\color{F39C11}{{普及-}}\) \color{F39C11}{{普及-}}\(\color{FFC116}{{普及}}\) \color{FFC116}{{普及}}\(\color{FFD700}{{普及+}}\) \color{FFD700}{{普及+}}\(\c…...

202112_摆烂杯_WhatAHack!

流量分析Tags:流量分析,CTFSHOW 0x00. 题目 这是你沐师傅的站的流量,最近你沐师傅去跟着某讯搭了一个WP平台后发了一篇文章再测试了一下自己的网站就再也没去管过平台了。结果被某位名字貌似大概可能叫g4_simon的大黑阔给hack掉了网站,并进行了一些操作拿到了沐师傅放在平台里…...

少儿 500 常用汉字 字帖

500 常用汉字 每个字加入拼音 每个字加入笔画笔顺 少儿楷书练习下载链接如下 1-4画 5画 6画 7画 8画 9画 10画 11-16画...

Ubuntu 安装 gcc

命令 gcc --version 或者 gcc -v 能查看 gcc 版本。 未安装:安装命令: sudo apt update # 更新软件包源 sudo apt-get install build-essential gdb这样,GCC 就安装完成了。...

Redis常见性能问题

常见性能问题和解决方案?Master最好不要做任何持久化工作,包括内存快照和AOF日志文件,特别是不要启用内存快照做持久化。 如果数据比较关键,某个Slave开启AOF备份数据,策略为每秒同步一次。 为了主从复制的速度和连接的稳定性,Slave和Master最好在同一个局域网内。 尽量避…...

3 线性模型

目录P22 P22 复习一下: 假设同类别之间的数据是比较相似的,所以在空间里,同类别的数据是挨在一起的。那么假设现在有一个超平面去进行二分类,由于一个类别的数量多得多而且两个类别的权重是一样的,于是超平面就可以把很多少数类分为正数类而且损失函数的值要下降(看P12,…...

详细介绍:七彩喜智慧养老:用科技温暖晚年,让关爱永不掉线

详细介绍:七彩喜智慧养老:用科技温暖晚年,让关爱永不掉线pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New",…...

P3522 [POI 2011] TEM-Temperature

题目描述 给出 \(n\) 个数所在区间,求最长可能不降区间。 思路 首先,我们要解决不降的问题,如何才能保证两个相邻区间选数可能不降,不难发现,只要前一个数的最大值大于等于后一个数的最小值即可,即 \(r_{i-1} \ge l_i\)。 然后,因为我们要求的是一段一段连续的区间,所以…...

202105_风二西_SQL基于时间盲注

流量分析,SQL注入,基于时间盲注,蚁剑AntSwordTags:流量分析,SQL注入,基于时间盲注,蚁剑AntSword 0x00. 题目 附件路径:https://pan.baidu.com/s/1GyH7kitkMYywGC9YJeQLJA?pwd=Zmxh#list/path=/CTF附件 附件名称:202105_风二西_SQL基于时间盲注.zip 0x01. WP 1. 浏览流量包,…...

实用指南:【C++】list容器的模拟实现

实用指南:【C++】list容器的模拟实现pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important…...

windows系统缺失DLL库文件下载方法

https://cn.dll-files.com/ windows系统缺失DLL文件下载方法_dll文件下载官网-CSDN博客...

更为通用的决策单调性

学习自 在线决策单调性地皮还能单老哥分治做? - 洛谷专栏 决策单调性最为常用的为分治和二分队列,前者要求离线,后者必须快速处理两个位置的转移,都有一定的局限性,其他算法大部分码量较长,很难应用。 但我们还有一种好写且能维护复杂转移的写法, 简易版 LARSCH 算法,一…...

一文读懂 PHP PSR 接口 PSR-3、PSR-7、PSR-11、PSR-15 完整指南

一文读懂 PHP PSR 接口 PSR-3、PSR-7、PSR-11、PSR-15 完整指南 现代 PHP 的选择很多。这本来是好事,但一到升级框架、替换 Logger,或在团队间统一服务时,你会发现:看不见的耦合(类型、方法签名、约定)会把小改动变成大手术。 本文用通俗的话讲清四个关键标准——PSR-3(…...

2025模拟赛Round9

T1 T2 T3 T4 T5 T6\({\color{#F39C11} 普及− }\) \({\color{#FFC116} 普及/提高− }\) \({\color{#3498DB} 提高+/省选− }\) \({\color{#3498DB} 提高+/省选− }\) \({\color{#3498DB} 提高+/省选− }\) \({\color{#3498DB} 提高+/省选− }\)参赛网址:https://boyacoding.cn…...

NOIP2025模拟赛19

T1 T2 T3 T4\({\color{#3498DB} 提高+/省选− }\) \({\color{#3498DB} 提高+/省选− }\) \({\color{#9D3DCF} 省选/NOI− }\) \({\color{#3498DB} 提高+/省选− }\)参赛网址:https://oj.33dai.cn/d/TYOI/contest/68919c89c5d9c2f14c1a537f T2,T4搭建未完成 T1 人才计数【NOIP2…...

Qt/C++开发监控GB28181系统/公网对讲/代码实现28181语音对讲/采集本地麦克风数据/支持udp和tcp模式

一、前言说明 按照国标的文档,语音对讲这块,并没有强制要求支持公网对讲,所以当初设备厂家做的都是支持的udp对讲,而且按照国标协议要求,对讲是先发一个语音对讲广播到设备,设备收到后,主动发起对讲到服务端,和视频点播是反着来的,这样的话数据的传输模式只能设备控制…...

P3195 [HNOI2008] 玩具装箱 (斜率优化)

题目描述 一道不限段数的分段问题,要求给出 \(n\) 个元素,求出分任意组所产生的最小代价。 思路 我们可以分为两步来求解这个问题,暴力转移与优化。 The First Step 暴力转移 考虑暴力DP,根据题目描述,每个容器之中玩具的编号都是连续的,并且不限容器数量,状态就很好定义…...

DBeaver使用指南

概述 由于众所周知的原因,公司不容许使用非授权正版软件。datagrip本身挺不错的,但是要倒腾激活码之类的,比较麻烦。只能从开源社区寻找好用的DBMS GUI工具。 发现DBeaver挺不错,功能很全,但是默认的配置不够好用、字体、样式等都不友好,需要打磨一番才行。 下文重点关注…...

sh-2025模拟赛

CSP-J 模拟(九)题目解答 一、单项选择题(每题2分,共30分) 1. 进制转换计算 答案:C 解析:先将八进制数\((2025)_8\)转换为十进制: \(2\times8^3 + 0\times8^2 + 2\times8^1 + 5\times8^0 = 2\times512 + 0 + 16 + 5 = 1024 + 21 = 1045\)。 将十六进制数\((2025)_{16}\)…...