首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

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

2012-11-16 
有关超类型和子类型编程的设计模式问题在我的程序中,需要多次的重复如下的操作,我有一个超类型,这个超类型

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


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

谢谢,我试试 3 楼 rainerWJY 2008-09-02   http://www.jdon.com/designpatterns/visitor.htm
我不是做广告。不过正好和你现在说的需求类似。
可以做简单变更,如果你需要用一个方法来处理所有visitor的话。
4 楼 zhangcheng 2008-09-02   rainerWJY 写道http://www.jdon.com/designpatterns/visitor.htm
我不是做广告。不过正好和你现在说的需求类似。
可以做简单变更,如果你需要用一个方法来处理所有visitor的话。



但是这个visitor模式不是针对collection里面是不同类型的对象么?我的问题的着重点应该在类型啊,难道我需要把类型放到collection中么?
不是很明白,希望高手给予解答。 5 楼 rainerWJY 2008-09-02   e..collection会抹去子类特性而保留超类特性。
这和你现在遇到的问题是类似的。
visitor模式的意思呢,我个人理解是这样
首先声明一个公共的accept()或者run()这样的接口。
里面是你真正需要实现的子类业务逻辑。
然后呢,将它注册到一个visitor的collection里面

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

最终决定以何种方式来执行这个accept().是在你申明该对象的时候。
6 楼 zhangcheng 2008-09-02   rainerWJY 写道e..collection会抹去子类特性而保留超类特性。
这和你现在遇到的问题是类似的。
visitor模式的意思呢,我个人理解是这样
首先声明一个公共的accept()或者run()这样的接口。
里面是你真正需要实现的子类业务逻辑。
然后呢,将它注册到一个visitor的collection里面

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

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


我认为不太合适。

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

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

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


我认为不太合适。

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

你知道子类干什么用呢?

从你的描述,已经可以感觉到可能是对collection里应该放些什么理解不正确造成的问题了 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里面应该放些什么?
9 楼 rainerWJY 2008-09-04   collection里面一般来说都会放一类对象咯。。。
一类对象一般的都会有一个或几个可以用相同的名字来表述的方法。否则一般来说是不会被放在一个collection中的。
java还是更应该选择面向接口编程。这样下层实现方式更多样,抽象和概括的能力也更好一些。不需要去关注过多的实现细节(如果细节和概括的东西都放在一起,那么就是方法爆炸了,很难搞的非常清楚)
想办法用公共的方法和属性来搞事就行了。
不想用instanceof那就搞一个getType.
不过一般来说都没有这个需要吧。
换句话说,如果你的不同子类的方法很不同,那么他们为什么会被规范为同一个父类的实现呢?
10 楼 zhangcheng 2008-09-05   rainerWJY 写道collection里面一般来说都会放一类对象咯。。。
一类对象一般的都会有一个或几个可以用相同的名字来表述的方法。否则一般来说是不会被放在一个collection中的。
java还是更应该选择面向接口编程。这样下层实现方式更多样,抽象和概括的能力也更好一些。不需要去关注过多的实现细节(如果细节和概括的东西都放在一起,那么就是方法爆炸了,很难搞的非常清楚)
想办法用公共的方法和属性来搞事就行了。
不想用instanceof那就搞一个getType.
不过一般来说都没有这个需要吧。
换句话说,如果你的不同子类的方法很不同,那么他们为什么会被规范为同一个父类的实现呢?



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


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

场景不同 方式也不同,你可以贴下他的思路。如果你就是这个场景,一个collection里面有很多object 我想知道他内部是什么针对性的搞事。那肯定是instanceof最简单直接。。
12 楼 yunhaifeiwu 2008-12-09  

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

则:建义楼主,看看类反射

热点排行