锁定老帖子 主题:有关超类型和子类型编程的设计模式问题
该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2008-09-02
在我的程序中,需要多次的重复如下的操作,我有一个超类型,这个超类型有多个子类型(继承关系),在程序实现的过程中,我可是用过某种方法得到超类型(实际上是某种子类型,但是只有返回超类型的返回值的方法),这个时候我要判断这个超类型的具体类型的时候,就要做多次的instanceof判断,我觉得这个比较麻烦,请问有没有更好的方法,或者是不是有这样的设计模式来解决这个问题的。谢谢。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-09-02
可以试试 Visitor - 访问者模式
|
|
返回顶楼 | |
发表时间:2008-09-02
galaxy_pan 写道 可以试试 Visitor - 访问者模式
谢谢,我试试 |
|
返回顶楼 | |
发表时间:2008-09-02
http://www.jdon.com/designpatterns/visitor.htm
我不是做广告。不过正好和你现在说的需求类似。 可以做简单变更,如果你需要用一个方法来处理所有visitor的话。 |
|
返回顶楼 | |
发表时间:2008-09-02
rainerWJY 写道 http://www.jdon.com/designpatterns/visitor.htm
我不是做广告。不过正好和你现在说的需求类似。 可以做简单变更,如果你需要用一个方法来处理所有visitor的话。 但是这个visitor模式不是针对collection里面是不同类型的对象么?我的问题的着重点应该在类型啊,难道我需要把类型放到collection中么? 不是很明白,希望高手给予解答。 |
|
返回顶楼 | |
发表时间:2008-09-02
e..collection会抹去子类特性而保留超类特性。
这和你现在遇到的问题是类似的。 visitor模式的意思呢,我个人理解是这样 首先声明一个公共的accept()或者run()这样的接口。 里面是你真正需要实现的子类业务逻辑。 然后呢,将它注册到一个visitor的collection里面 这样你在进行操作的时候呢,就不需要去考虑他是个什么类型了 直接运行accept()或者run().多态就自动帮你去子类实际的那个accept()或者run() 方法里去调用你实际的方法了。 最终决定以何种方式来执行这个accept().是在你申明该对象的时候。 |
|
返回顶楼 | |
发表时间:2008-09-02
rainerWJY 写道 e..collection会抹去子类特性而保留超类特性。
这和你现在遇到的问题是类似的。 visitor模式的意思呢,我个人理解是这样 首先声明一个公共的accept()或者run()这样的接口。 里面是你真正需要实现的子类业务逻辑。 然后呢,将它注册到一个visitor的collection里面 这样你在进行操作的时候呢,就不需要去考虑他是个什么类型了 直接运行accept()或者run().多态就自动帮你去子类实际的那个accept()或者run() 方法里去调用你实际的方法了。 最终决定以何种方式来执行这个accept().是在你申明该对象的时候。 我认为不太合适。 现在的情况是,到来的client是个父类型,我想知道到底属于那个子类型,而不需要进行if else还有instanceof的判断。 |
|
返回顶楼 | |
发表时间:2008-09-02
zhangcheng 写道 rainerWJY 写道 e..collection会抹去子类特性而保留超类特性。
这和你现在遇到的问题是类似的。 visitor模式的意思呢,我个人理解是这样 首先声明一个公共的accept()或者run()这样的接口。 里面是你真正需要实现的子类业务逻辑。 然后呢,将它注册到一个visitor的collection里面 这样你在进行操作的时候呢,就不需要去考虑他是个什么类型了 直接运行accept()或者run().多态就自动帮你去子类实际的那个accept()或者run() 方法里去调用你实际的方法了。 最终决定以何种方式来执行这个accept().是在你申明该对象的时候。 我认为不太合适。 现在的情况是,到来的client是个父类型,我想知道到底属于那个子类型,而不需要进行if else还有instanceof的判断。 你知道子类干什么用呢? 从你的描述,已经可以感觉到可能是对collection里应该放些什么理解不正确造成的问题了 |
|
返回顶楼 | |
发表时间:2008-09-02
rainerWJY 写道 zhangcheng 写道 rainerWJY 写道 e..collection会抹去子类特性而保留超类特性。
这和你现在遇到的问题是类似的。 visitor模式的意思呢,我个人理解是这样 首先声明一个公共的accept()或者run()这样的接口。 里面是你真正需要实现的子类业务逻辑。 然后呢,将它注册到一个visitor的collection里面 这样你在进行操作的时候呢,就不需要去考虑他是个什么类型了 直接运行accept()或者run().多态就自动帮你去子类实际的那个accept()或者run() 方法里去调用你实际的方法了。 最终决定以何种方式来执行这个accept().是在你申明该对象的时候。 我认为不太合适。 现在的情况是,到来的client是个父类型,我想知道到底属于那个子类型,而不需要进行if else还有instanceof的判断。 你知道子类干什么用呢? 从你的描述,已经可以感觉到可能是对collection里应该放些什么理解不正确造成的问题了 那collection里面应该放些什么? |
|
返回顶楼 | |
发表时间:2008-09-04
collection里面一般来说都会放一类对象咯。。。
一类对象一般的都会有一个或几个可以用相同的名字来表述的方法。否则一般来说是不会被放在一个collection中的。 java还是更应该选择面向接口编程。这样下层实现方式更多样,抽象和概括的能力也更好一些。不需要去关注过多的实现细节(如果细节和概括的东西都放在一起,那么就是方法爆炸了,很难搞的非常清楚) 想办法用公共的方法和属性来搞事就行了。 不想用instanceof那就搞一个getType. 不过一般来说都没有这个需要吧。 换句话说,如果你的不同子类的方法很不同,那么他们为什么会被规范为同一个父类的实现呢? |
|
返回顶楼 | |