Vector存储对象的一个问题

03-07-05 KillerMan
一个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
2003-07-05 17:08
如果A,B,C三个类都是集成的同一个超类,超类又实现的同一个接口就没问题。

但A,B,C单个类的差别太大了,不可能使用同一个超类。

likewater
2003-07-05 18:08
弄一个接口不行吗?

A/B/C都IMPLEMENTS这个接口就是了,中间我看不必走这个超类了吧

KillerMan
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
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
2003-07-07 10:46
reflect是可以。

一开始犯晕了。以为得到的是一个object,列举出来的方法都是object的那些方法。

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

jbwang
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
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
2003-07-07 18:45
这是典型的Visitor设计模式解决方案

参考

http://www.jdon.com/designpatterns/visitor.htm

banq
2003-07-07 18:45
这是典型的Visitor设计模式解决方案

参考

http://www.jdon.com/designpatterns/visitor.htm

KillerMan
2003-07-07 20:48
reflect还是最灵活的解决方案,只要各个类中有同名的方法就是了。

程序写了N多了,不可能再回头给所有的包含show方法的类定义一个接口。

banq
2003-07-08 10:52
reflect 加 visitor模式

e-peng
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"(属于对象判断方法)和对象强制转换方法。

天下为公
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
2003-07-17 11:19
对啊,用接口是可以实现的,jbwang的代码难道不能解决这个问题吗?

猜你喜欢
2Go 1 2 下一页