`
zhangcheng
  • 浏览: 119958 次
  • 性别: 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开发者的重要步骤。 最后,实践是检验学习成果的最好方式。通过参与...

    编程中常遇到的英文缩写

    - **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**:递归是指函数调用自身的过程。 以上列举了计算机编程领域中常见的英文词汇及相关的...

    深入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章 创建功能强大的窗体 ...

    Visual C++MFC编程实例

    10.3 例48 用超分类定制一个通用 控件窗口 188 10.4 例49 在按钮上放置位图 190 10.5 例50 动态填充一个组合框 192 10.6 例51 排序一个列表控件 194 10.7 例52 分隔线控件 196 第11章 绘图 198 11.1 例53 绘制图形 ...

Global site tag (gtag.js) - Google Analytics