用Java中的抽象类扩展抽象类

示例问题

当我创建Java :: Geci抽象类AbstractFieldsGeneratorAbstractFilteredFieldsGenerator我遇到了一个不太复杂的设计问题。 我想强调一下,对于某些人来说,这个问题和设计可能看起来很明显,但是在我最近与一位初级开发人员(我的儿子Mihály的交谈)中,我的文章比我的英语要好得多,意识到这个话题可能仍然有价值。

无论如何。 我有这两个类,字段和过滤字段生成器。 第二堂课扩展了第一堂课

 abstract class AbstractFilteredFieldsGenerator extends AbstractFieldsGenerator {... 

添加额外的功能,同时应为具体实现提供相同的签名。 这是什么意思?

这些生成器有助于使用反射为特定类生成代码。 因此,他们处理的输入信息是Class对象。 字段生成器类具有一个抽象方法process() ,该方法将为每个字段调用。 它是从一个实现的方法调用的,该方法遍历字段并分别对每个字段进行调用。 当具体类extends AbstractFieldsGenerator并由此实现此抽象方法时,它将被调用。 当更改相同的具体类以使其extends AbstractFilteredFieldsGenerator ,将仅对过滤后的方法调用具体方法。 我想要一个设计,以便在具体课程中唯一需要的更改是更改名称。

抽象类

问题定义

以更抽象的方式描述相同的问题:有两个抽象类AF以便F extends AF提供一些额外的功能。 两者都声明了具体类应实现的抽象方法m() 。 当具体的类C声明从C extends AC extends FC extends F时,方法m()的调用应更改,但类C不应有其他更改。 从类A定义的方法p()调用方法m() 。 如何设计F

这是什么问题?

可以通过两种明显不同的方式来扩展A

  • F覆盖m()使它混凝土在实施额外的功能m()并调用新的抽象方法,说mx()
  • F使用提供额外功能的版本覆盖方法p() (在上面的示例中进行过滤),并调用仍然抽象的方法m()

第一种方法不能满足由具体类C实施的签名应保持相同的要求。 第二种方法将A的已经实现的功能扔到垃圾桶上,并以不同的方式重新实现它。 在实践中这是可能的,但是肯定会进行一些复制/粘贴编程。 这是有问题的,让我不解释原因。

问题的根源

在工程中,当我们面对这样的问题时,通常意味着问题或结构没有得到很好的描述,解决方案位于完全不同的区域中。 换句话说,有些假设驱动我们的思维方式是错误的。 在这种情况下,问题在于我们假设抽象类提供了一个扩展“ API”来对其进行扩展。 请注意,API不仅可以调用。 对于抽象类,扩展该抽象类时要实现的API。 正如库可以为不同的使用方式提供不同的API(Java 9 HTTP客户端可以send()以及sendAsync() )抽象(实际上也是非抽象的)类也可以提供不同的扩展方式用于不同的目的。

如果不修改A就无法编码F达到我们的设计目标。 我们需要一个A版本,该版本提供不同的API来创建具体的实现,而另一个版本(不一定要是正交的)可以创建一个仍然抽象的扩展。

在这种情况下,API之间的区别在于,具体实现的目标是在调用链的末尾,而抽象扩展要挂接到链的最后一个元素。 A的实现必须提供要挂接到调用链的最后一个元素上的API。 这已经是解决方案。

我们在类F实现了方法ma() ,我们希望p()调用ma()而不是直接调用m() 。 修改A我们可以做到。 我们在A定义ma() ,然后从p()调用ma() p() 。 在A实现的ma()版本应毫不费力地调用m() ,以为A具体实现提供原始的“ API”。 F中的ma()实现包含额外的功能(在示例中为过滤),然后调用m() 。 这样,任何具体的类都可以扩展AF并可以使用完全相同的签名实现m() 。 我们还避免了复制/粘贴编码,只是调用m()是在ma()的两个版本中相同的代码。

如果我们希望类F具有更多抽象类可扩展性,则F::ma实现不应直接调用m() ,而应调用m()的新mf() m() 。 这样,新的抽象类可以覆盖mf()从而再次提供新功能并调用抽象m()

带走

  1. 对抽象类进行编程非常复杂,有时很难清楚地了解谁在调用谁以及哪种实现。 如果您意识到这可能是一件复杂的事情,则可以克服这一挑战。 记录,可视化,讨论可以帮助您的任何方式。
  2. 当您不能解决问题时(在示例中,如何对F进行编码),您应该挑战环境(我们隐式地认为问题A的类A是不变的:“如何实现F ?”)。
  3. 避免复制/粘贴编程。 (面食包含大量CH,使您的代码变胖,动脉被阻塞,最后,应用程序的心脏将停止跳动。)
  4. 尽管在本文中没有详细介绍,但是请注意,抽象层次越深,要清楚地了解谁来呼叫谁就越困难(另请参见第1点)。
  • 在https://github.com/verhas/abstractchain中找到示例演示应用程序
  • 在https://github.com/verhas/javageci中找到具有这种模式的原始的,稍微复杂的应用程序

翻译自: https://www.javacodegeeks.com/2019/06/extending-abstract-classes-with-abstract-classes-in-java.html

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

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

相关文章

工业交换机与工业路由器的区别

工业交换机(也叫工业以太网交换机),即应用于工业控制领域的以太网交换机设备,由于采用的网络标准,其开放性好、应用广泛以及价格低廉、使用的是透明而统一的TCP/IP协议,以太网已经成为工业控制领域的主要通…

Sublime介绍安装和使用(转载)

转载: 原文链接:https://blog.csdn.net/ITTechnologyHome/article/details/80486235 1.1 Sublime介绍 Sublime是一款跨平台、收费的文件编辑器,可以用来编写HTML,CSS,JavaScript,PHP等应用程序。 1.2 Sublime特点 跨平台,支持主流操作系统…

工业交换机在城市智慧轨道交通中的应用分析

俗话说,城市建设,交通先行,轨道交通是解决“城市病”的一把金钥匙,而智慧交通更是建设智慧城市的重要构成部分。从2009年开始,我国就逐渐进入城市轨道交通建设的高潮,并逐年扩大地铁市场。发展以轨道交通为…

apache hive_Hive:使用Apache Hive查询客户最喜欢的搜索查询和产品视图计数

apache hive这篇文章介绍了如何使用Apache Hive查询Hadoop下存储的搜索点击数据。 我们将以示例的形式生成有关总产品浏览量的客户最爱搜索查询和统计信息。 继续之前的文章 使用大数据分析客户产品搜索点击次数 , Flume:使用Apache Flume收集客户产品…

工业交换机在工业通信领域的应用分析

工业交换机是专门为满足灵活多变的工业应用需求而设计,提供一种高性价比工业以太网通讯解决方案。工业交换机,作为我们广为使用的局域网硬件设备,一直为大家所熟悉。它的普及程度其实是由于以太网的广泛使用,作为今天以太网的主流…

工业以太网交换机都有哪些作用

工业以太网交换机由于使用及定位的关系,区别于商业交换机,它更关注稳定性,耐高温,耐振动,耐腐蚀等一些工业特性。工业以太网交换机以其较高的防护等级(一般IP40)、较强的电磁兼容性(EMS 4级&…

光纤交换机是什么,光纤交换机的作用是什么?

随着网络的发展,先后出现了交换机、路由器、电话光端机等网络设备,在数据存储网络中,光纤交换机起到了重要的作用。今天飞畅科技的小编来为大家介绍下光纤交换机及光纤交换机的作用,一起来看看吧! 光纤交换机的简介 光…

光纤交换机产品功能介绍

光纤交换机是一种高速的网络传输中继设备,又叫做光纤通道交换机、SAN交换机,光纤传输的优点是速度快、抗干扰能力强。那么,光纤交换机有哪些功能呢?接下来我们就跟随飞畅科技的小编一起来看看吧! 通道协议支持 SAN交换…

光纤交换机光纤通道协议介绍

光纤通道(FC,Fibre Channel)协议是美国国家标准所指定的一种串行高速、低延时、低误码的标准协议能够为存储设备、IP 数据网、音频流等应用提供高速数据传输的骨干网络技术。随着光纤通道在不同领域的应用,在光纤通道协议的基础上…

POI创建的文档具有不同条件的灵活样式

介绍 这篇文章解释了基于各种标准将样式应用于文档的困难并提供了解决方案。 Java编程中的常见任务之一是根据存储在数据库中的数据创建Excel报告。 在这些情况下,Java程序员使用POI :-)。 这些报告通常具有严格的样式和数据格式规则。 数据通常是SQL查询执行的结果…

在NS-3中安装可视化工具pyviz的一些问题的解决

转载声明:本文为寻同学原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 原文链接:https://blog.csdn.net/qq_31676673/article/details/88107454 在NS-3中安装可视化工具pyviz的一些问题的解决 PyViz是一…

什么是光纤交换机?

光纤交换机是一种高速的网络传输中继设备,又叫做光纤通道交换机、SAN交换机,它较普通交换机而言,采用了光纤电缆作为传输介质。光纤传输的优点是速度快、抗干扰能力强。光纤交换机主要有两种,一是用来连接存储的FC交换机。另一种是…

java 调用 js性能_太快了,太变态了:什么会影响Java中的方法调用性能?

java 调用 js性能那么这是怎么回事? 让我们从一个简短的故事开始。 几周前,我提议对Java核心libs邮件列表进行更改 ,以覆盖当前final一些方法。 这刺激了一些讨论主题-其中之一是其中一个性能回归通过采取这是一个方法被引入的程度final免遭停…

VMware虚拟机扩展Ubuntu系统磁盘空间

转载:https://www.cnblogs.com/dongry/p/10620894.html 1 首先给虚拟机扩容 虚拟机->设置->硬盘->实用程序->扩展磁盘容量 2 启动Ubuntu系统 2.1 打开终端安装gparted,sudo apt-get install gparted;输入sudo gparted打开gparte…

操作方法:具有多个Mongo存储库和Kotlin的Spring Boot 2 Web应用程序

首先,免责声明:如果您正在编写微服务 (每个人现在都对吗?)并希望它是惯用的 ,那么通常不会在其中使用几个不同的数据源。 图片取自Pixabay© https: //pixabay.com/illustrations/software-binary-sys…

环网工业交换机ERPS技术解析

ERPS(Ethernet Ring Protection Switching,以太环网保护切换协议)是ITU开发的一种环网保护协议,也称G.8032。它是一个专门应用于以太环网的链路层协议。它在以太环网完整时能够防止数据环路引起的广播风暴,而当以太环网上一条链路断开时能迅速…

交换机和路由器的区别是什么?

在我们日常生活中,上网很多时候都要用到交换机和路由器,很多人只知道二者都是用于连接上网的设备,但很少知道它们之间有什么区别,以及各自的功能。 交换机和路由器的区别: 路由器可以给你的局域网自动分配IP&#xf…

apache flume_Flume:使用Apache Flume收集客户产品搜索点击数据

apache flume这篇文章涵盖了使用Apache flume收集客户产品搜索点击并使用hadoop和elasticsearch接收器存储信息。 数据可能包含不同的产品搜索事件,例如基于不同方面的过滤,分类信息,分页信息,以及进一步查看的产品以及某些被客户…

如何选配合适的百兆或者千兆工业交换机

工业上常常会用到工业交换机,工程商在做小型网络监控方案的时候,经常需要选配合适的百兆工业交换机或千兆工业交换机,但是,到底是配百兆工业交换机还是千兆工业交换机呢?如何计算百兆工业交换机和千兆工业交换机的码率…

使用Selenium自动化测试处理多个浏览器选项卡

使用Selenium进行自动化测试一直是将萌芽的自动化测试人员培养为专业人员的生命线。 硒是开源的,在全球范围内被广泛采用。 结果,您会得到社区的大力支持。 有多种用于不同语言的框架,这些框架提供与Selenium的绑定。 因此,您已经…