论坛首页 入门技术论坛

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

浏览 4837 次
该帖已经被评为新手帖
作者 正文
   发表时间:2008-09-02  


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


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



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

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

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

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

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


我认为不太合适。

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

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

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


我认为不太合适。

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


你知道子类干什么用呢?

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

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

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


我认为不太合适。

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


你知道子类干什么用呢?

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


那collection里面应该放些什么?
0 请登录后投票
   发表时间:2008-09-04  
collection里面一般来说都会放一类对象咯。。。
一类对象一般的都会有一个或几个可以用相同的名字来表述的方法。否则一般来说是不会被放在一个collection中的。
java还是更应该选择面向接口编程。这样下层实现方式更多样,抽象和概括的能力也更好一些。不需要去关注过多的实现细节(如果细节和概括的东西都放在一起,那么就是方法爆炸了,很难搞的非常清楚)
想办法用公共的方法和属性来搞事就行了。
不想用instanceof那就搞一个getType.
不过一般来说都没有这个需要吧。
换句话说,如果你的不同子类的方法很不同,那么他们为什么会被规范为同一个父类的实现呢?
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics