根据不同类型 父类进去子类

假设有一个基类Base和几个继承自Base的子类Sub1、Sub2等,每个子类都会把自己的实例注入到一个静态的Map中。

首先,定义基类和子类:

public class Base {// 抽象方法,子类需要实现public void doSomething() {throw new UnsupportedOperationException("Should be implemented in subclasses");}
}public class Sub1 extends Base {@Overridepublic void doSomething() {// 实现具体的操作}public static final String TYPE = "Sub1";public Sub1() {// 注册自己到静态Map中Registry.register(TYPE, this);}
}public class Sub2 extends Base {@Overridepublic void doSomething() {// 实现具体的操作}public static final String TYPE = "Sub2";public Sub2() {// 注册自己到静态Map中Registry.register(TYPE, this);}
}

然后,定义用于注册实例的Registry类:

import java.util.HashMap;
import java.util.Map;public class Registry {private static final Map<String, Base> registry = new HashMap<>();public static void register(String type, Base instance) {registry.put(type, instance);}public static Base getInstance(String type) {return registry.get(type);}
}

最后,可以根据类型来获取对应的实例并调用方法:


public class Main {public static void main(String[] args) {Base sub1 = Registry.getInstance("Sub1");Base sub2 = Registry.getInstance("Sub2");if (sub1 != null) {sub1.doSomething();}if (sub2 != null) {sub2.doSomething();}}
}

这个例子中,我们定义了一个基类Base和两个子类Sub1和Sub2。每个子类在构造时会把自己注册到Registry的静态map中,并提供了一个doSomething的实现。然后,我们可以通过Registry来获取对应类型的实例并调用它们的方法。这个例子展示了如何根据类型自动调用对应子类的方法,而无需手动判断类型并进行类型转换。

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

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

相关文章

5.3 Python 闭包函数,递归函数,匿名函数

1. 函数对象 Python中所有的数据都是对象, 函数的值也是一个对象, 通过函数名获取函数对象. 使用函数名也就是使用函数对象, 函数对象加上括号立刻执行函数体代码块. 函数名的其它作用: * 1. 函数名可以作为其它变量的值. * 2. 函数名可以作为其它函数的参数. * 3. 函数名可以…

搜索与图论:染色法判别二分图

搜索与图论&#xff1a;染色法判别二分图 题目描述参考代码 题目描述 输入样例 4 4 1 3 1 4 2 3 2 4输出样例 Yes参考代码 #include <cstring> #include <iostream> #include <algorithm>using namespace std;const int N 100010, M 200010;int n, m; i…

多款可观测产品全面升级丨阿里云云原生 5 月产品月报

云原生月度动态 云原生是企业数字创新的最短路径。 《阿里云云原生每月动态》&#xff0c;从趋势热点、产品新功能、服务客户、开源与开发者动态等方面&#xff0c;为企业提供数字化的路径与指南。 趋势热点 &#x1f947; 阿里云云原生产品负责人李国强&#xff1a;推进可…

《Brave New Words 》9.1 AI 世界中的就业

Part IX: Work and What Comes Next 第九部分&#xff1a;工作及其未来发展 The one who plants trees, knowing that he will never sit in their shade, has at least started to understand the meaning of life. —Rabindranath Tagore 种树的人&#xff0c;虽然知道他永远…

如何舒适的使用VScode

安装好VScode后通常会很不好用&#xff0c;以下配置可以让你的VScode变得好用许多。 VScode的配置流程 1、设置VScode中文2、下载C/C拓展&#xff0c;使代码可以跳转3、更改编码格式4、设置滚轮缩放5、设置字体6、设置保存自动改变格式7、vscode设置快捷代码8、下载插件并学会…

MongoDB中UPDATE操作$pullAll

学习mongodb&#xff0c;体会mongodb的每一个使用细节&#xff0c;欢迎阅读威赞的文章。这是威赞发布的第70篇mongodb技术文章&#xff0c;欢迎浏览本专栏威赞发布的其他文章。如果您认为我的文章对您有帮助或者解决您的问题&#xff0c;欢迎在文章下面点个赞&#xff0c;或者关…

Java多线程面试重点-1

0. 什么是并发&#xff1f;什么是并行&#xff1f; 并发&#xff1a;把时间分成一段一段&#xff0c;每个线程轮流抢占时间段。 如果时间段非常短&#xff0c;线程切换非常快&#xff0c;被称为伪并行。并行&#xff1a;多个线程可以同时运行。 并发与并行造成的影响&#xff…

ARM32开发--IIC软实现

知不足而奋进 望远山而前行 目录 文章目录 前言 开发流程 GD32F4软件I2C初始化 GD32F4软件I2C引脚功能 写操作 读操作 总结 前言 在嵌入式系统开发中&#xff0c;软件实现的I2C通信协议扮演着至关重要的角色。本文将深入探讨如何在GD32F4系列微控制器上实现软件I2C功能…

Springboot配置websocket,https使用 WebSocket 连接

Springboot配置websocket&#xff0c;https使用 WebSocket 连接 提示&#xff1a;本文简单介绍websocket与http的区别及如何在项目中使用websocket&#xff0c;以springboot项目为例 一、http协议与websocket协议区别 WebSocket 一种在单个TCP连接上进行全双工通信的协议。W…

深入浅出 Go 语言的 GPM 模型(Go1.21)

引言 在现代软件开发中&#xff0c;有效地利用并发是提高应用性能和响应速度的关键。随着多核处理器的普及&#xff0c;编程语言和框架如何高效、简便地支持并发编程&#xff0c;成为了软件工程师们评估和选择工具时的一个重要考量。在这方面&#xff0c;Go 语言凭借其创新的并…

动态规划算法设计步骤

1. 定义状态&#xff08;构建记忆表&#xff09;&#xff1a; 首先&#xff0c;需要确定问题的状态。状态可以表示为一个包含所有可能决策的变量的集合。例如&#xff0c;对于一个背包问题&#xff0c;状态可以表示为一个包含所有物品和它们的重量的数组。 2. 初始化&#xff…

Python的Pillow(图像处理库)非常详细的学习笔记

Python的Pillow库是一个非常强大的图像处理库。 安装Pillow库&#xff1a; 在终端或命令行中输入以下命令来安装Pillow&#xff1a; pip install pillow 安装后查看是否安装成功以及当前版本 pip show Pillow 升级库&#xff1a; pip install pillow --upgrade 一些基…

探索Ubuntu:从入门到精通

目录 一、什么是Ubuntu? 1.1 Ubuntu的定义和背景 1.2 Ubuntu的特点 二、安装Ubuntu 2.1 下载Ubuntu安装镜像 2.2 制作启动盘 2.3 安装Ubuntu 三、初步设置和基本操作 3.1 系统更新 3.2 安装必要软件 3.3 设置和管理用户账户 四、文件和目录管理 4.1 文件管理器 …

u-boot(六) - 详细启动流程

一&#xff0c;u-boot启动第一阶段 1&#xff0c;启动流程 ENTRY(_start) //arch/arm/lib/vectors.S ----b resets //arch/arm/cpu/armv7/start.S --------b save_boot_params ------------b save_boot_params_ret //将cpu的工作模式设置为SVC32模式&#xff08;即管理模式&a…

NodeClub:NodeJS构造开源交流社区

NodeClub&#xff1a; 连接每一个想法&#xff0c;NodeClub让社区更生动- 精选真开源&#xff0c;释放新价值。 概览 NodeClub是一个基于Node.js和MongoDB构建的社区系统&#xff0c;专为开发者和社区爱好者设计。它提供了一套完整的社区功能&#xff0c;包括用户管理、内容发…

Mongodb在UPDATE操作中使用$push向数组中插入数据

学习mongodb&#xff0c;体会mongodb的每一个使用细节&#xff0c;欢迎阅读威赞的文章。这是威赞发布的第69篇mongodb技术文章&#xff0c;欢迎浏览本专栏威赞发布的其他文章。如果您认为我的文章对您有帮助或者解决您的问题&#xff0c;欢迎在文章下面点个赞&#xff0c;或者关…

spark mllib 特征学习笔记 (一)

PySpark MLlib 特征处理详解 PySpark MLlib 提供了丰富的特征处理工具&#xff0c;帮助我们进行特征提取、转换和选择。以下是 PySpark MLlib 中常用的特征处理类及其简要介绍。 1. Binarizer Binarizer 是将连续特征二值化的转换器。 from pyspark.ml.feature import Bina…

Postman接口测试工具:全面解析与应用指南

标题&#xff1a;Postman接口测试工具&#xff1a;全面解析与应用指南 在当今的软件开发领域&#xff0c;接口测试是确保软件质量和稳定性的重要环节。而Postman作为一款广泛使用的接口测试工具&#xff0c;以其强大的功能和直观的操作界面赢得了开发者和测试人员的青睐。本文…

qt dll编写和调用

dll编写 新建项目 头文件 #ifndef LIB1_H #define LIB1_H#include "lib1_global.h"class LIB1_EXPORT Lib1 { public:Lib1(); };//要导出的函数&#xff0c;使用extern "C"&#xff0c;否则名称改变将找不到函数extern "C" LIB1_EXPORT int ad…