`
zhangcheng
  • 浏览: 120641 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

有关超类型和子类型编程的设计模式问题

    博客分类:
  • Java
阅读更多


在我的程序中,需要多次的重复如下的操作,我有一个超类型,这个超类型有多个子类型(继承关系),在程序实现的过程中,我可是用过某种方法得到超类型(实际上是某种子类型,但是只有返回超类型的返回值的方法),这个时候我要判断这个超类型的具体类型的时候,就要做多次的instanceof判断,我觉得这个比较麻烦,请问有没有更好的方法,或者是不是有这样的设计模式来解决这个问题的。谢谢。
分享到:
评论
12 楼 yunhaifeiwu 2008-12-09  


如果楼主是这样种意思的话:
     在客户端得到一个超类的实例,然后通过判断得到该实例具体的子类型,然后调用该子类例相关的属性或方法。

则:建义楼主,看看类反射
11 楼 rainerWJY 2008-09-05  
zhangcheng 写道



我现在使用的是一个人开源的工具包,里面的代码就是这样实现的。
至于为什么规范称为同一个父类,我想是为了更方便的解析XmlSchema,只能这样做的。


场景不同 方式也不同,你可以贴下他的思路。如果你就是这个场景,一个collection里面有很多object 我想知道他内部是什么针对性的搞事。那肯定是instanceof最简单直接。。
10 楼 zhangcheng 2008-09-05  
rainerWJY 写道
collection里面一般来说都会放一类对象咯。。。
一类对象一般的都会有一个或几个可以用相同的名字来表述的方法。否则一般来说是不会被放在一个collection中的。
java还是更应该选择面向接口编程。这样下层实现方式更多样,抽象和概括的能力也更好一些。不需要去关注过多的实现细节(如果细节和概括的东西都放在一起,那么就是方法爆炸了,很难搞的非常清楚)
想办法用公共的方法和属性来搞事就行了。
不想用instanceof那就搞一个getType.
不过一般来说都没有这个需要吧。
换句话说,如果你的不同子类的方法很不同,那么他们为什么会被规范为同一个父类的实现呢?



我现在使用的是一个人开源的工具包,里面的代码就是这样实现的。
至于为什么规范称为同一个父类,我想是为了更方便的解析XmlSchema,只能这样做的。
9 楼 rainerWJY 2008-09-04  
collection里面一般来说都会放一类对象咯。。。
一类对象一般的都会有一个或几个可以用相同的名字来表述的方法。否则一般来说是不会被放在一个collection中的。
java还是更应该选择面向接口编程。这样下层实现方式更多样,抽象和概括的能力也更好一些。不需要去关注过多的实现细节(如果细节和概括的东西都放在一起,那么就是方法爆炸了,很难搞的非常清楚)
想办法用公共的方法和属性来搞事就行了。
不想用instanceof那就搞一个getType.
不过一般来说都没有这个需要吧。
换句话说,如果你的不同子类的方法很不同,那么他们为什么会被规范为同一个父类的实现呢?
8 楼 zhangcheng 2008-09-02  
rainerWJY 写道
zhangcheng 写道
rainerWJY 写道
e..collection会抹去子类特性而保留超类特性。
这和你现在遇到的问题是类似的。
visitor模式的意思呢,我个人理解是这样
首先声明一个公共的accept()或者run()这样的接口。
里面是你真正需要实现的子类业务逻辑。
然后呢,将它注册到一个visitor的collection里面

这样你在进行操作的时候呢,就不需要去考虑他是个什么类型了
直接运行accept()或者run().多态就自动帮你去子类实际的那个accept()或者run()
方法里去调用你实际的方法了。

最终决定以何种方式来执行这个accept().是在你申明该对象的时候。


我认为不太合适。

现在的情况是,到来的client是个父类型,我想知道到底属于那个子类型,而不需要进行if else还有instanceof的判断。


你知道子类干什么用呢?

从你的描述,已经可以感觉到可能是对collection里应该放些什么理解不正确造成的问题了


那collection里面应该放些什么?
7 楼 rainerWJY 2008-09-02  
zhangcheng 写道
rainerWJY 写道
e..collection会抹去子类特性而保留超类特性。
这和你现在遇到的问题是类似的。
visitor模式的意思呢,我个人理解是这样
首先声明一个公共的accept()或者run()这样的接口。
里面是你真正需要实现的子类业务逻辑。
然后呢,将它注册到一个visitor的collection里面

这样你在进行操作的时候呢,就不需要去考虑他是个什么类型了
直接运行accept()或者run().多态就自动帮你去子类实际的那个accept()或者run()
方法里去调用你实际的方法了。

最终决定以何种方式来执行这个accept().是在你申明该对象的时候。


我认为不太合适。

现在的情况是,到来的client是个父类型,我想知道到底属于那个子类型,而不需要进行if else还有instanceof的判断。


你知道子类干什么用呢?

从你的描述,已经可以感觉到可能是对collection里应该放些什么理解不正确造成的问题了
6 楼 zhangcheng 2008-09-02  
rainerWJY 写道
e..collection会抹去子类特性而保留超类特性。
这和你现在遇到的问题是类似的。
visitor模式的意思呢,我个人理解是这样
首先声明一个公共的accept()或者run()这样的接口。
里面是你真正需要实现的子类业务逻辑。
然后呢,将它注册到一个visitor的collection里面

这样你在进行操作的时候呢,就不需要去考虑他是个什么类型了
直接运行accept()或者run().多态就自动帮你去子类实际的那个accept()或者run()
方法里去调用你实际的方法了。

最终决定以何种方式来执行这个accept().是在你申明该对象的时候。


我认为不太合适。

现在的情况是,到来的client是个父类型,我想知道到底属于那个子类型,而不需要进行if else还有instanceof的判断。
5 楼 rainerWJY 2008-09-02  
e..collection会抹去子类特性而保留超类特性。
这和你现在遇到的问题是类似的。
visitor模式的意思呢,我个人理解是这样
首先声明一个公共的accept()或者run()这样的接口。
里面是你真正需要实现的子类业务逻辑。
然后呢,将它注册到一个visitor的collection里面

这样你在进行操作的时候呢,就不需要去考虑他是个什么类型了
直接运行accept()或者run().多态就自动帮你去子类实际的那个accept()或者run()
方法里去调用你实际的方法了。

最终决定以何种方式来执行这个accept().是在你申明该对象的时候。
4 楼 zhangcheng 2008-09-02  
rainerWJY 写道
http://www.jdon.com/designpatterns/visitor.htm
我不是做广告。不过正好和你现在说的需求类似。
可以做简单变更,如果你需要用一个方法来处理所有visitor的话。



但是这个visitor模式不是针对collection里面是不同类型的对象么?我的问题的着重点应该在类型啊,难道我需要把类型放到collection中么?
不是很明白,希望高手给予解答。
3 楼 rainerWJY 2008-09-02  
http://www.jdon.com/designpatterns/visitor.htm
我不是做广告。不过正好和你现在说的需求类似。
可以做简单变更,如果你需要用一个方法来处理所有visitor的话。
2 楼 zhangcheng 2008-09-02  
galaxy_pan 写道
可以试试 Visitor - 访问者模式


谢谢,我试试
1 楼 galaxy_pan 2008-09-02  
可以试试 Visitor - 访问者模式

相关推荐

    2023“钉耙编程”中国大学生算法设计超级联赛(7)-资料包.zip

    《2023“钉耙编程”中国大学生算法设计超级联赛》是一个旨在提升大学生编程技能和算法设计能力的重要赛事。这个资料包包含了参赛者需要掌握的核心知识点,主要聚焦于编程语言和算法两个关键领域。下面将对这两个领域...

    C#设计模式

    C#设计模式的讨论通常包括创建型模式、结构型模式和行为型模式三大类。 1. **创建型模式** - 单例模式:确保一个类只有一个实例,并提供一个全局访问点。 - 工厂模式:定义一个用于创建对象的接口,让子类决定...

    ZF-007脱机编程下载器

    【ZF-007脱机编程下载器】是一款由智峰工作室精心研发的USB编程工具,专为电子工程师和开发者设计。它具有坚固的金属外壳,小巧轻便且价格实惠,是USB编程下载器市场中的佼佼者,以其稳定性和高性能而备受推崇。 该...

    《C程序设计实用教程》电子课件

    《C程序设计实用教程》是一本面向初学者和进阶者的经典教材,旨在教授C语言的基础知识和编程技巧。这本教程通过清晰易懂的讲解和丰富的实例,帮助读者掌握C语言的核心概念,包括基本语法、数据类型、控制结构、函数...

    面试-C++操作系统数据库设计模式

    而设计模式则是软件工程中的一个重要组成部分,涉及面向对象设计中常用到的一些模式和方法,以提高代码的可重用性、可维护性及可扩展性。 1. C++源文件从文本到可执行文件经历的过程: 预处理阶段,预处理器将处理...

    Head-First-Design-Patterns-master设计模式官方源码

    1. 工厂模式(Factory Pattern):工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式,通过一个公共接口(工厂方法)来创建不同类型的实例,避免了客户端直接实例化具体类的耦合。 2. 抽象工厂模式...

    php编程(超高清)

    理解MVC(模型-视图-控制器)设计模式,学习如何使用PHP框架(如Laravel、Symfony或CodeIgniter),以及如何部署和优化PHP应用,都是成为专业PHP开发者的重要步骤。 最后,实践是检验学习成果的最好方式。通过参与...

    电子设计论文MSP430和nRF905的无线数传系统设计

    其具备多种睡眠模式和高效的数据处理能力,特别适合于需要长时间工作但又对功耗要求极高的场合。而nRF905是Nordic公司生产的一款高性能的单片射频收发器,它支持433/868/915MHz三个频段,能够提供高速无线数据传输...

    Python网络编程.pdf

    - **设计模式应用**:如状态模式,可用于管理连接的不同阶段,如连接建立、数据传输和断开连接,确保状态的一致性和完整性。 #### 客户端高级方面 客户端的设计同样涉及高级话题,如错误处理、重试策略以及与...

    历年软件设计师考试C++题集.doc

    以上两个案例展示了两种常用的设计模式——策略设计模式和组合设计模式的具体应用。通过对这些题目进行深入分析,考生不仅可以巩固自己的C++编程技能,还可以学习如何运用设计模式解决实际问题。这对于软件设计师...

    编程中常遇到的英文缩写

    - **OOAD (Object Oriented Analysis Design)**:面向对象分析与设计,是在软件工程中使用的一种方法论,用于分析问题域并设计解决方案。 ### Oracle 缩写 - **DB (Database)**:数据库,是存储和管理数据的集合。...

    STM32F4xxx编程指南

    《STM32F4xxx编程指南》是一份宝贵的资源,它不仅涵盖了Cortex-M4处理器的所有关键知识点,还深入解析了STM32F4xxx微控制器的架构和编程细节。对于希望在嵌入式系统领域有所建树的开发者而言,这份指南无疑是必读之...

    XML教材和编程。。。。

    ### XML教材和编程知识点详述 #### XML的基础与编程概览 XML(eXtensible Markup Language)是一种标记语言,用于定义数据结构和存储数据,它具有高度的灵活性和可扩展性,允许用户自定义标签,以适应各种数据类型...

    常用的计算机编程英语词汇

    5. **Dynamic Programming**:动态规划是一种算法设计思想,通过将问题分解成更小的子问题来解决复杂问题。 6. **Recursion**:递归是指函数调用自身的过程。 以上列举了计算机编程领域中常见的英文词汇及相关的...

    计算机编程英语词汇.pdf

    ### 计算机编程英语词汇知识点详解 #### 数据结构(Data Structures) - **基本数据结构**:数据结构是计算机科学中的一个重要...递归通常用于解决那些可以分解为相同类型子问题的问题,例如搜索树的遍历、排序算法等。

    深入Java Servlet网络编程

    1 远程方法调用中的设计模式 11. 3. 2 设计应用程序子协议 11. 3. 3 远程方法调用的实例 第12章 在Servlet中发送和接收邮件 12. 1 电子邮件协议 12. 2 利用SMIP发送电子邮件 12. 2. 1 利用网络编程发送邮件 ...

    Access 2000中文版高级编程(part1)

    8.11.3 用查询设计网格以解决模糊字段的引用问题 233 8.12 使用分析器向导 233 8.12.1 表分析器向导 234 8.12.2 性能分析器向导 234 8.12.3 文档管理器 236 8.13 小 结 236 第9章 创建功能强大的窗体 237 9.1...

    Web程序设计电子教案\Web程序设计实验手册 完整版

    《Web程序设计电子教案》与《Web程序设计实验手册》是学习Web开发的重要参考资料,尤其适合初学者和希望深入理解Web技术的学员。这两份资料提供了全面、详细的Web开发知识,涵盖从基础到进阶的各种主题。 Web程序...

    Access+2000中文版高级编程

    8.11.3 用查询设计网格以解决模糊字段的引用问题 233 8.12 使用分析器向导 233 8.12.1 表分析器向导 234 8.12.2 性能分析器向导 234 8.12.3 文档管理器 236 8.13 小 结 236 第9章 创建功能强大的窗体 ...

Global site tag (gtag.js) - Google Analytics