`
zhangcheng
  • 浏览: 118637 次
  • 性别: 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 - 访问者模式

相关推荐

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

    深入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...

    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 绘制图形 ...

    Visual Basic 6编程技术大全 中译本扫描版带书签 2/2

    5.3.3查找和替换子字符串154 5.3.4字符串的格式化选项157 5.4 日期和时间的处理157 5.4.1当前日期和时间的获取及设置157 5.4.2 Date和Time型数值的建立和提取158 5.4.3日期的运算160 5.4.4日期和时间值的格式选项161...

    Visual Basic 6编程技术大全 中译本扫描版带书签 1/2

    5.3.3查找和替换子字符串154 5.3.4字符串的格式化选项157 5.4 日期和时间的处理157 5.4.1当前日期和时间的获取及设置157 5.4.2 Date和Time型数值的建立和提取158 5.4.3日期的运算160 5.4.4日期和时间值的格式选项161...

    asp.net知识库

    帮助解决网页和JS文件中的中文编码问题的小工具 慎用const关键字 装箱,拆箱以及反射 动态调用对象的属性和方法——性能和灵活性兼备的方法 消除由try/catch语句带来的warning 微软的应试题完整版(附答案) 一个...

    Linux网络编程

    6.7.2 和DNS 有关的函数和结构............ 158 6.7.3 DNS 例程........... 159 6.8 套接字的Client/Server 结构实现的例子.... 160 6.8.1 简单的流服务器.... 161 6.8.2 简单的流式套接字客户端程序....... 163 ...

    linux 网络编程源代码

    1.6 Linux 和 Unix 的发展 .................................................................................... 15 第二章 UNIX/Linux 模型....................................................................

    C#编程经验技巧宝典

    C#编程经验技巧宝典源代码,目录如下: 第1章 开发环境 1 <br>1.1 Visual Studio开发环境安装与配置 2 <br>0001 安装Visual Studio 2005开发环境须知 2 <br>0002 配置合适的Visual Studio 2005...

    C语言220例从易到难源代码

    147 VGA256色模式编程 148 绘制蓝天图案 149 屏幕检测程序 150 运动的小车动画 151 动态显示位图 152 利用图形页实现动画 153 图形时钟 154 音乐动画 第五部分 系统篇 155 读取DOS系统中的国家信息 156 ...

    XML编程综合资料库

    1.2.1 设计与特定领域有关的标记语言... 13 1.2.2 自描述数据... 13 1.2.3 应用间交换数据... 14 1.2.4 结构化和集成的数据... 14 1.3 XML文档的“生命”. 15 1.3.1 编辑器... 15 1.3.2 语法分析程序和处理...

    非线性系统手册原书第5版混沌,分形,元胞自动机,遗传算法,基因表达式编程,支持向量机,小波,隐马尔可夫模型,模糊逻辑与C 、JAVA和SymbolicC 程序

    非线性系统手册 第五版:混沌,分形,元胞自动机,遗传算法,基因表达式编程,支持向量机,小波,隐马尔可夫模型,模糊逻辑与C++、JAVA和SymbolicC++程序 出版时间:2013年版 内容简介  《非线性系统手册(第5版)...

    服务器的设计.docx

    UNIX网络的服务器程序设计方法 (刘凯 刘春旭,四川大学计算机学院) 摘要:介绍了几种网络操作模式和UNIX下基于TCP/IP协议的网络客户/服务器模式的程序架构。重点对客户/服务器模式中服务器程序的几种设计方法进行...

    网页与Web程序设计 课件 ppt 机械工业出版社 part1

    本书全面讲授网页设计与制作技术、JavaScript脚本编程和Web数据库应用技术。本书以目前最流行的网页设计三剑客Dreamweaver 8、Fireworks 8和Flash 8作为支撑平台,由浅入深,系统地介绍了网页的构思、规划、制作和...

    Access 2000数据库系统设计(PDF)---002

    31.2.3 DAP设计模式 51.3 为Microsoft数据引擎创建 Access数据 项目 51.3.1 新的ADP工具和对象 61.3.2 NorthwindCS项目和da Vinci工具 箱的深入研究 61.4 OfficeVBA编辑器和Access的集成 91.5 DAP和DHTML的HTML源...

    Access 2000数据库系统设计(PDF)---003

    31.2.3 DAP设计模式 51.3 为Microsoft数据引擎创建 Access数据 项目 51.3.1 新的ADP工具和对象 61.3.2 NorthwindCS项目和da Vinci工具 箱的深入研究 61.4 OfficeVBA编辑器和Access的集成 91.5 DAP和DHTML的HTML源...

    Access 2000数据库系统设计(PDF)---018

    31.2.3 DAP设计模式 51.3 为Microsoft数据引擎创建 Access数据项目 51.3.1 新的ADP工具和对象 61.3.2 NorthwindCS项目和da Vinci工具箱的深入研究 61.4 OfficeVBA编辑器和Access的集成 91.5 DAP和DHTML的HTML源编辑...

    Access 2000数据库系统设计(PDF)---011

    31.2.3 DAP设计模式 51.3 为Microsoft数据引擎创建 Access数据项目 51.3.1 新的ADP工具和对象 61.3.2 NorthwindCS项目和da Vinci工具箱的深入研究 61.4 OfficeVBA编辑器和Access的集成 91.5 DAP和DHTML的HTML源编辑...

Global site tag (gtag.js) - Google Analytics