JiveJdon Community Forums
在线456人   首页   主题表   培训咨询   标签   精华   查搜   注册    登陆 RSS
首页 » 论坛 » J2EE/JavaEE/JEE/EJB/JSF等技术讨论
???en_US.forumThreadPrev.name??? 上一主题
  Go back to the topic 返回本主题   Go back to the topic listing返回主题列表
???en_US.forumThreadNext.name??? 下一主题
1 2 Go 总共有 19 回复 / 2
 发表新帖子   回复该主题贴
KillerMan

悄悄话
发表文章: 154
注册时间: 2008年02月27日 18:33
Vector存储对象的一个问题 2003年07月05日 16:56 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
标签列表 对象设计(46)      visitor模式(10)      反射(17)     
一个Vector v 中存储了A a、 B b、C c三个对象,A,B,C 三个类实现了一个共同的接口show(),但各自的实际工作有很大差别。
现在要访问a,b,c三个对象的show()方法,该如何访问?

问题:
一个对象存入到Vector中时,转换成了一个Object对象,从Vector中取出时也是一个Object,需要先转换成原来的类的类型,才能调用该类的方法,a,b,c存入到Vector中后(程序)就不知道它属于那个类,也就不知道该怎么转换。

该如何解决这个问题,原来考虑使用reflect来解决,但是不行。
KillerMan

悄悄话
发表文章: 154
注册时间: 2008年02月27日 18:33
Re: Vector存储对象的一个问题 2003年07月05日 17:08 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
如果A,B,C三个类都是集成的同一个超类,超类又实现的同一个接口就没问题。
但A,B,C单个类的差别太大了,不可能使用同一个超类。
likewater

悄悄话
发表文章: 42
注册时间: 2002年12月08日 12:41
Re: Vector存储对象的一个问题 2003年07月05日 18:08 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
弄一个接口不行吗?
A/B/C都IMPLEMENTS这个接口就是了,中间我看不必走这个超类了吧
KillerMan

悄悄话
发表文章: 154
注册时间: 2008年02月27日 18:33
Re: Vector存储对象的一个问题 2003年07月06日 12:03 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
接口解决不料这个问题。
问题具体在这里:
Vector v = new Vector();
v.add(new A());
v.add(new B());
v.add(new C());
Enumeration e = v.elements();
while(e.hasMoreElements()){
//问题在这里,Type在程序中没办法决定是什么
Type tmp = (Type) e.nextElement();
//A,B,C所实现的接口show()
tmp.show();
}

接口,是不行的。共同的超类可以,例如三个类的超类都是D,那么Type是D就行了,根据多态的理论,tmp会自动调用合适的show()。
但,a,b,c的功能差别太大了,除了show()方法的功能有相似之处。所有肯定不能让他们继承同一个超类。
wys1978

悄悄话
发表文章: 160
注册时间: 2002年09月03日 12:28
Re: Vector存储对象的一个问题 2003年07月06日 22:21 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
quote: 该如何解决这个问题,原来考虑使用reflect来解决,但是不行。

为什么不能使用reflect?


while(e.hasMoreElements()){
//use reflect
Object tmp = e.nextElement();
Method show = tmp.getClass().getMethod(
"show");
//assume parameters is null;
show.invoke(null, null);
}
KillerMan

悄悄话
发表文章: 154
注册时间: 2008年02月27日 18:33
问题了结了。 2003年07月07日 10:46 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
reflect是可以。
一开始犯晕了。以为得到的是一个object,列举出来的方法都是object的那些方法。

楼上的兄弟的思路是行的,但Menthod类使用的不对。不过还是谢了先。
jbwang

悄悄话
发表文章: 18
注册时间: 2003年06月26日 14:25
Re: Vector存储对象的一个问题 2003年07月07日 10:51 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
接口不行,怎么会?
public class First {

public static void main(String[] args) {

java.util.Vector v = new java.util.Vector();
v.add(new A());
v.add(new B());
v.add(new C());

for (int i=0; i<v.size(); i++) {
((InFace) v.get(i)).show();
}
}
}

interface InFace {
public void show();
}

class A implements InFace {
public void show() {
System.out.println("A class");
}
}

class B implements InFace {
public void show() {
System.out.println("B class");
}
}

class C implements InFace {
public void show() {
System.out.println("C class");
}
}

结果:(ant执行)
Buildfile: build.xml

run:
[java] A class
[java] B class
[java] C class

BUILD SUCCESSFUL
Total time: 1 second
easysmile

悄悄话
发表文章: 1
注册时间: 2003年07月07日 16:02
Re: Vector存储对象的一个问题 2003年07月07日 16:09 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
一个比较笨的方法,但肯定是可以行得通的。

for(i=0;i<v.size();i++)
{
Object obj=v.get(i);
if(obj instanceof A)
{
((A)obj).show();
}
if(obj instanceof B)
{
((B)obj).show();
}
if(obj instanceof C)
{
((C)obj).show();
}
}


一个Vector v 中存储了A a、 B b、C c三个对象,A,B,C 三个类实现了一个共同的接口show(),但各自的实际工作有很大差别。
现在要访问a,b,c三个对象的show()方法,该如何访问?
banq

悄悄话
发表文章: 9524
注册时间: 2002年08月03日 17:08
Re: Vector存储对象的一个问题 2003年07月07日 18:45 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
这是典型的Visitor设计模式解决方案
参考
http://www.jdon.com/designpatterns/visitor.htm
banq

悄悄话
发表文章: 9524
注册时间: 2002年08月03日 17:08
Re: Vector存储对象的一个问题 2003年07月07日 18:45 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
这是典型的Visitor设计模式解决方案
参考
http://www.jdon.com/designpatterns/visitor.htm
KillerMan

悄悄话
发表文章: 154
注册时间: 2008年02月27日 18:33
Re: Vector存储对象的一个问题 2003年07月07日 20:48 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
reflect还是最灵活的解决方案,只要各个类中有同名的方法就是了。
程序写了N多了,不可能再回头给所有的包含show方法的类定义一个接口。
banq

悄悄话
发表文章: 9524
注册时间: 2002年08月03日 17:08
Re: Vector存储对象的一个问题 2003年07月08日 10:52 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
reflect 加 visitor模式
e-peng

悄悄话
发表文章: 3
注册时间: 2003年07月09日 17:09
object pascal启示 2003年07月09日 17:38 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
在object pascal中通过"is"来判断某一实例对象属于哪一对象类。通过
强制转换来实现操作。X是某一数组列表属于TX1、TX2、TX3的一元素。通过枚举方法实现X操作如:
if X is TX1 then
TX1(X).Show
else if X is TX2 then
TX2(X).Show
else if X is TX3 then
TX3(X).Show;
目前正在学Java对Java还不很熟悉,不知道java有没有类似“Is"(属于对象判断方法)和对象强制转换方法。
天下为公

悄悄话
发表文章: 31
注册时间: 2003年07月15日 17:09
Re: Vector存储对象的一个问题 2003年07月17日 10:26 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
for (int i = 0; i < size; i++ )
{
allob aR =(allob)_receivers.elementAt( i );
aR.show();
}
其中receivers表示Vector对象,allob是了A a、 B b、C c实现的接口.
lianhw

悄悄话
发表文章: 3
注册时间: 2003年06月27日 14:20
Re: Vector存储对象的一个问题 2003年07月17日 11:19 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
对啊,用接口是可以实现的,jbwang的代码难道不能解决这个问题吗?
这个主题有 19 回复 / 2Go 1 2
???en_US.forumThreadPrev.name??? 上一主题
  Go back to the topic 返回本主题   Go back to the topic listing返回主题列表    返回页首返回页首
???en_US.forumThreadNext.name??? 下一主题
热点TAG: AOP cache 缓存 DDD EJB 集群 设计模式 Hibernate IOC JiveJdon OO RBAC Seam Spring Struts
正在读取,请等待...
google yahoo 新浪ViVi 365Key网摘 天极网摘 CSDN网摘 添加到百度搜藏 POCO网摘 博采网摘
查询本论坛内 回复超过的热门帖子
     回复该主题贴
标题
 
粗体 斜体 下划线 插入图片 插入代码 插入url链接 插入附件
内容
  每2分种自动备份发贴内容Ctrl-V粘贴取出,提问题前先查询标签列表

RSS 手机阅读 add to google add to yahoo
解惑之道在J道 ,打造中国最具影响力的的企业软件社区
OpenSource JIVEJDON v3.0 Powered by JdonFramework Code © 2002-08 jdon.com

anti spam